2010-07-24 33 views
67

Tôi có một hàm phân tích cú pháp độ dài được mã hóa từ một bộ đệm byte, nó trả về độ dài được phân tích là int và đưa chỉ mục vào bộ đệm dưới dạng số nguyên arg. Tôi muốn hàm cập nhật chỉ mục theo những gì được phân tích cú pháp, tức là muốn chuyển chỉ mục đó theo 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 việc chuyển chỉ số arg. dưới dạng int[], nhưng hơi xấu xí.Java: Cách tốt nhất để chuyển int bằng tham chiếu

+11

'Số nguyên' là không thay đổi. –

+0

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

+0

Bạn nên quay trở lại 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 về thiết kế 'lớp học' của bạn –

Trả lời

67

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

13

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

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

Lưu ý rằng java.lang.Integer là không thay đổi.

+0

Còn về 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 thực hiện điều này một cách chính xác). – icbytes

+1

Có icbyte. AtomicInteger là một lựa chọn tốt. – Prasath

19

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

13

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

+6

Chính xác. Đừng ép buộc Java làm theo cách của bạn, làm theo cách Java. Java không phải là C. Cố gắng để làm cho nó hoạt động như C sẽ luôn luôn là hacks xấu xí. –

6

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

public class Inte{ 
     public int x=0; 
} 

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

Inte inte=new Inte(); 

sau đó bạn có thể vượt qua inte như là đối số mà bạn muốn vượt qua một biến số nguyên :

public void function(Inte inte) { 
some code 
} 

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

inte.x=value; 

để nhận giá trị:

Variable=inte.x; 
7

Bạn có thể sử dụng java.util.concurrent.atomic.AtomicInteger.

2

Bạn có thể tạo ra một lớp tham khảo để quấn nguyên thủy:

public class Ref<T> 
{ 
    public T Value; 

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

Sau đó, bạn có thể tạo ra các chức năng mà phải mất một tham chiếu như một 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; 
    } 
} 

Cách 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.

Các vấn đề liên quan