2010-12-12 29 views
10

Như chúng ta biết cả hai ngôn ngữ là pass-by-giá trị khi truyền tham số cho phương pháp. Nhưng C# hỗ trợ refout từ khóa để chuyển qua tham chiếu các loại nguyên thủy. Tôi đang tìm kiếm cùng một từ khóa và kỹ thuật trong Java?C# của ref và ra trong Java

Tôi đoán là sử dụng Integer lớp wrapper thay vì int trong Java để vượt qua trong.

Mọi góp ý và các ví dụ?

Trả lời

12

Đoán của bạn là chính xác. Một wrapper là cần thiết (nhưng không phải là Integer vì nó là bất biến).

Một số người sử dụng mảng yếu tố duy nhất cho mục đích này:

int[] x = { 0 }; 
int[] y = { 0 }; 
someMethod(x, y); 
return x[0] + y[0]; 

Nhiều sẽ xếp hạng kỹ thuật mà phải lên đó với GOTO.

Một số người định nghĩa một lớp giữ generic:

public class Holder<T> { 
    private T _value; 
    private Holder(T value) { _value = value; } 
    public static of(T value) { return new Holder<T>(value); } 
    public T getValue() { return _value; } 
    public void setValue(T value) { _value = value; } 
} 

... 

Holder<String> x = Holder.of("123"); 
Holder<String> y = Holder.of("456"); 
someMethod(x, y); 
return x.getValue() + y.getValue(); 

Một số định nghĩa một kiểu mục đích xây dựng:

SomeMethodResult result = someMethod(x, y); 
return result.getX() + result.getY(); 

Một số sẽ sắp xếp cho công việc sẽ được thực hiện bên trong phương pháp, tránh sự cần thiết cho các đối số tham chiếu ở vị trí đầu tiên:

return someMethod(x, y); 

Mỗi kỹ thuật này s có lợi thế và bất lợi:

  • mảng: đơn giản so vớixấu xí, dựa vào mảng có đúng một phần tử
  • giữ: an toàn so với tiết, đấm bốc
  • mục đích xây dựng loại: an toàn so với tiết, có thể quá mức cần thiết
  • thay đổi phương pháp: an toàn, vs sạch phải lúc nào cũng có thể

Cá nhân, tôi nghĩ rằng Java đã làm rối tung điều này. Tôi muốn tránh các tham số không tham chiếu, nhưng tôi muốn Java cho phép nhiều giá trị trả lại từ một phương thức. Nhưng, trung thực, tôi không thường xuyên đi qua cái này. Tôi sẽ không đưa ra một quả thận cho tính năng này. :)

+0

Tôi thích kỹ thuật 'int []'. Tôi đã thử nó và nó hoạt động tốt. Cảm ơn. – Tarik

+0

+1 Câu trả lời toàn diện và tôi khá đồng ý với đoạn cuối. – BoltClock

+0

IMO 'int []' là xấu xí nhưng không ở đâu gần "' goto' -level ". Đó là hack xung quanh việc thiếu một tính năng ngôn ngữ (thực sự pass-by-tham khảo) theo cách đơn giản, mà làm cho nó khá nhiều chính xác cùng một điều như "đi qua con trỏ" trong C. Chúng tôi không cần nó thường xuyên trong Java như trong C, nhưng đó là cơ bản chỉ vì cách hai ngôn ngữ đối phó với quản lý bộ nhớ và, trên một mức độ khái niệm hơn, "quản lý đối tượng". –

5

Java không hỗ trợ tính năng này.

+0

+1. Ngắn và đến điểm :-) – Joey

1

Java không hỗ trợ truyền các kiểu nguyên thủy theo tham chiếu.

Gói int làm Integer sẽ không hữu ích vì đây là loại không thể thay đổi (tức là không thể thay đổi khi được tạo).

1

Java không tích hợp sẵn. Integer sẽ không làm, bởi vì nó là bất biến. Bạn không thể thay đổi trạng thái của nó.

Bạn sẽ phải tạo lớp trình bao bọc có thể thay đổi riêng của mình. Nhưng điều này rất "nguy hiểm" và có thể dẫn đến kết quả không mong muốn, vì vậy hãy cố gắng tránh nó.

1

Cách duy nhất để vượt qua giá trị trở lại là chuyển một tham chiếu đến một giá trị có thể thay đổi như

public void calc(int[] value) { value[0] = 1; } 
public void calc(AtomicInteger value) { value.set(1); } 

tuy nhiên, điều đơn giản nhất cần làm là trả lại tất cả các giá trị đã thay đổi

public int calc() { return 1; } 
Các vấn đề liên quan