Java: วิธีที่ดีที่สุดในการส่งผ่าน int โดยการอ้างอิง


84

ฉันมีฟังก์ชั่นการแยกวิเคราะห์ที่แยกวิเคราะห์ความยาวที่เข้ารหัสจากบัฟเฟอร์ไบต์มันจะคืนค่าความยาวที่แยกวิเคราะห์เป็น int และรับดัชนีลงในบัฟเฟอร์เป็นจำนวนเต็ม arg ฉันต้องการให้ฟังก์ชันอัปเดตดัชนีตามสิ่งที่แยกวิเคราะห์กล่าวคือต้องการส่งผ่านดัชนีนั้นโดยการอ้างอิง ใน C ฉันจะส่งint *ไฟล์. อะไรคือวิธีที่สะอาดที่สุดในการทำใน Java ฉันกำลังดูการส่งดัชนี arg ในฐานะที่เป็นint[]แต่มันน่าเกลียดไปหน่อย


13
Integerไม่เปลี่ยนรูป
Yuval Adam

1
หากคุณต้องการหลีกเลี่ยงไลบรารี apache คุณสามารถส่งค่า int และส่งคืนค่าที่อัปเดตได้ ถ้าเป็นสองค่าขอแนะนำให้ใช้ Point เป็นคอนเทนเนอร์ มิฉะนั้นตัวเลือกอาร์เรย์หรือคำแนะนำอื่น ๆ ที่นี่ก็ใช้ได้
EntangledLoops

คุณควรส่งคืน int หรือวัตถุ หากคุณต้องการมากกว่าหนึ่งอย่างจริงๆคุณควรทบทวนการออกแบบ 'คลาส' ของคุณเสียใหม่
Ujjwal Singh

คำตอบ:


72

คุณสามารถลองใช้org.apache.commons.lang.mutable.MutableIntจากไลบรารี Apache Commons ไม่มีวิธีดำเนินการโดยตรงในภาษาตัวเอง


24

ไม่สามารถทำได้ใน Java ตามที่คุณได้แนะนำวิธีหนึ่งคือส่งint[]ไฟล์. อีกอย่างจะมีคลาสเล็ก ๆ น้อย ๆ เช่นIntHolderที่ห่อintไฟล์.


20

คุณไม่สามารถส่งผ่านอาร์กิวเมนต์โดยการอ้างอิงใน Java

สิ่งที่คุณทำได้คือตัดค่าจำนวนเต็มของคุณในออบเจ็กต์ที่ไม่แน่นอน การใช้ Apache Commons MutableIntเป็นตัวเลือกที่ดี อีกวิธีที่ซับซ้อนกว่าเล็กน้อยคือใช้วิธีที่int[]คุณแนะนำ ฉันจะไม่ใช้มันเพราะมันไม่ชัดเจนว่าทำไมคุณถึงห่อintอาร์เรย์เซลล์เดียว

สังเกตว่าjava.lang.Integerไม่เปลี่ยนรูป


แล้วการใช้งาน AtomicInteger ล่ะ? สิ่งนี้ไม่แน่นอนและส่งผ่านข้อมูลอ้างอิงหรือไม่ (Afaik AtomicReference <Boolean> ทำสิ่งนี้ถูกต้อง)
icbytes


14

ห่อบัฟเฟอร์ไบต์และดัชนีไว้ในวัตถุByteBuffer ByteBuffer สรุปแนวคิดของตำแหน่งบัฟเฟอร์ + และช่วยให้คุณสามารถอ่านและเขียนจากตำแหน่งที่จัดทำดัชนีซึ่งจะอัปเดตเมื่อคุณดำเนินการ


6
ตรง อย่าบังคับให้ Java ทำในแบบของคุณทำแบบ Java Java ไม่ใช่ C ความพยายามที่จะทำให้มันทำหน้าที่เหมือน C มักจะเป็นการแฮ็กที่น่าเกลียด
Skip Head

9

คุณสามารถออกแบบคลาสใหม่ได้ดังนี้:

public class Inte{
       public int x=0;
}

ในภายหลังคุณสามารถสร้างวัตถุของคลาสนี้:

Inte inte=new Inte();

จากนั้นคุณสามารถส่งผ่านinteเป็นอาร์กิวเมนต์ที่คุณต้องการส่งผ่านตัวแปรจำนวนเต็ม:

public void function(Inte inte) {
some code
}

ดังนั้นสำหรับการอัปเดตค่าจำนวนเต็ม:

inte.x=value;

เพื่อรับมูลค่า:

Variable=inte.x;

8

คุณสามารถสร้างคลาสอ้างอิงเพื่อรวมกลุ่มดั้งเดิม:

public class Ref<T>
{
    public T Value;

    public Ref(T value)
    {
        Value = value;
    }
}

จากนั้นคุณสามารถสร้างฟังก์ชั่นที่ใช้ Reference เป็นพารามิเตอร์:

public class Utils
{
    public static <T> void Swap(Ref<T> t1, Ref<T> t2)
    {
        T temp = t1.Value;
        t1.Value = t2.Value;
        t2.Value = temp;
    }
}

การใช้งาน:

Ref<Integer> x = 2;
Ref<Integer> y = 9;
Utils.Swap(x, y);

System.out.println("x is now equal to " + x.Value + " and y is now equal to " + y.Value";
// Will print: x is now equal to 9 and y is now equal to 2

หวังว่านี่จะช่วยได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.