Java: Cách tốt nhất để chuyển int bằng tham chiếu


84

Tôi có một hàm phân tích cú pháp phân tích độ dài được mã hóa từ bộ đệm byte, nó trả về độ dài được phân tích cú pháp dưới dạng int và nhận một chỉ mục vào bộ đệm dưới dạng số nguyên đối số. Tôi muốn hàm cập nhật chỉ mục theo những gì nó được phân tích cú pháp, tức là muốn chuyển chỉ mục đó bằng tham chiếu. Trong C, tôi chỉ cần vượt qua một int *. Cách sạch nhất để làm điều này trong Java là gì? Tôi hiện đang xem xét vượt qua đối số chỉ số. như một int[], nhưng nó hơi xấu xí.


13
Integerlà bất biến.
Yuval Adam

1
Nếu bạn muốn tránh thư viện apache, bạn có thể chuyển int và trả về giá trị đã cập nhật. Nếu đó là hai giá trị, tôi khuyên bạn nên sử dụng Point làm vùng chứa. Nếu không, tùy chọn mảng hoặc một trong các đề xuất khác ở đây là tốt.
EntangledLoops

Bạn nên trả về một int hoặc một đối tượng; Nếu bạn thực sự cần nhiều hơn một, có lẽ bạn nên suy nghĩ lại thiết kế của bạn 'lớp'
Ujjwal Singh

Câu trả lời:


72

Bạn có thể thử sử dụng org.apache.commons.lang.mutable.MutableInttừ thư viện Apache Commons. Không có cách trực tiếp nào để làm điều này bằng chính ngôn ngữ.


24

Điều này không thể thực hiện được trong Java. Như bạn đã đề xuất một cách là vượt qua một int[]. Khác sẽ có một lớp nhỏ, ví dụ như IntHolderbọc một int.


20

Bạn không thể chuyển đối số bằng tham chiếu trong Java.

Những gì bạn có thể làm là bọc giá trị số nguyên của mình trong một đối tượng có thể thay đổi. Sử dụng Apache Commons ' MutableIntlà một lựa chọn tốt. Một cách khác, hơi khó hiểu hơn, là sử dụng một cách int[]giống như bạn đã đề xuất. Tôi sẽ không sử dụng nó vì không rõ tại sao bạn lại gói một intmảng trong một mảng đơn ô.

Lưu ý rằng điều đó java.lang.Integerlà bất biến.


Còn việc sử dụng AtomicInteger thì sao? Điều này có thể thay đổi và được chuyển qua tham chiếu không? (Afaik AtomicReference <Boolean> làm đúng điều này).
icbytes


14

Gói bộ đệm byte và chỉ mục vào một đối tượng ByteBuffer . Một ByteBuffer đóng gói khái niệm về bộ đệm + vị trí và cho phép bạn đọc và ghi từ vị trí được lập chỉ mục, nó sẽ cập nhật khi bạn thực hiện.


6
Chính xác. Đừng ép buộc Java làm theo cách của bạn, hãy làm theo cách của Java. Java không phải là C. Nỗ lực làm cho nó hoạt động giống như C sẽ luôn là những bản hack xấu xí.
Bỏ qua Head vào

9

Bạn có thể thiết kế lớp mới như thế này:

public class Inte{
       public int x=0;
}

sau này bạn có thể tạo đối tượng của lớp này:

Inte inte=new Inte();

thì bạn có thể truyền intedưới dạng đối số mà bạn muốn truyền một biến số nguyên:

public void function(Inte inte) {
some code
}

vì vậy để cập nhật giá trị số nguyên:

inte.x=value;

để nhận giá trị:

Variable=inte.x;

8

Bạn có thể tạo một lớp Tham chiếu để bọc các nguyên thủy:

public class Ref<T>
{
    public T Value;

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

Sau đó, bạn có thể tạo các hàm lấy Tham chiếu làm tham số:

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;
    }
}

Sử dụng:

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

Hi vọng điêu nay co ich.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.