2012-04-28 52 views
6

Tôi đến từ nền C++ và đang tự hỏi về các tính năng bất biến của Java. Có thể trả về giá trị của hàm được chỉ định là const không? (có nghĩa là giá trị trả về không thể sửa đổi được)Giá trị trả về Const trong Java

Ngoài ra đối với điểm thưởng, C++ định nghĩa hàm có thể được postfix'ed dưới dạng const để nói rằng hàm sẽ không sửa đổi bất kỳ giá trị cấp lớp nào. Điều này cũng có thể trong Java? (nghĩa là một hàm theo định nghĩa sẽ không thể thay đổi trạng thái lớp của nó trong nội bộ)

Cảm ơn rất nhiều!

+1

Giá trị của nó không có gì trong Java của nó khó khăn hơn nhiều để có tác dụng phụ với ngôn ngữ đơn giản hơn nhiều, vì vậy bạn không phải đưa ra gợi ý tương tự để tối ưu hóa mã. –

+0

bản sao có thể có của [Tại sao không có từ khóa Hằng số trong Java?] (Http://stackoverflow.com/questions/2735736/why-is-there-no-constant-keyword-in-java) –

Trả lời

6

Không, Java final là rất khác với C++ 's const. Bạn không thể làm một trong những điều bạn yêu cầu.

Để làm cho một đối tượng không thay đổi, bạn có thể thực thi nó nhiều hơn hoặc ít hơn (trái với việc tham gia trợ giúp của trình biên dịch như trong C++). Từ http://docs.oracle.com/javase/tutorial/essential/concurrency/imstrat.html:

Các quy tắc sau đây xác định chiến lược đơn giản để tạo đối tượng không thay đổi. ...

  1. Không cung cấp phương thức "setter" - phương pháp sửa đổi trường hoặc đối tượng được tham chiếu theo trường.
  2. Tạo tất cả các trường finalprivate.
  3. Không cho phép lớp con ghi đè phương pháp. Cách đơn giản nhất để làm điều này là khai báo lớp là final. Một cách tiếp cận tinh vi hơn là làm cho hàm tạo private và xây dựng các cá thể trong các phương thức nhà máy .
  4. Nếu instance fields bao gồm tài liệu tham khảo cho các đối tượng có thể thay đổi, không cho phép các đối tượng phải được thay đổi:
    • Không cung cấp các phương pháp sửa đổi các đối tượng có thể thay đổi.
    • Không chia sẻ các tham chiếu đến các đối tượng có thể thay đổi. Không bao giờ lưu trữ các tham chiếu đến các đối tượng bên ngoài, có thể thay đổi được truyền cho hàm tạo; nếu cần thiết, tạo bản sao và lưu trữ các tham chiếu đến các bản sao. Tương tự, tạo các bản sao của các đối tượng có thể thay đổi bên trong của bạn khi cần để tránh trả lại bản chính trong các phương pháp của bạn.
+3

wow ...đó là khủng khiếp. Nó phải có rất nhiều công việc trong Java để bảo vệ nhà nước và như vậy. Cảm ơn câu trả lời cuối tuần! –

+0

@JonathanDunlap Tôi tin rằng cách để bảo vệ nhà nước là trả lại một đối tượng mới mà về bản chất là một bản sao của những gì bạn muốn quay trở lại. – Troyseph

1

Không, đó thực sự là không có cách nào để tạo các đối tượng bất biến ra khỏi bất cứ nơi nào. Nếu bạn muốn một cái gì đó bất biến, nó phải là bất biến (cuối cùng) dọc theo toàn bộ cây.

ví dụ: ví dụ sau đây sử dụng cuối cùng trong mọi nơi (trừ gốc) nhưng vẫn không thể ngăn chặn bất kỳ thay đổi:

public class justAnInt { 
    public int a = 0; 
    public int b = 0; 
} 

// ----------------------------------- 

public class AliasProblem{ 
    private final justAnInt var = new justAnInt(); 
    final justAnInt getVar() 
    { 
     return var; 
    } 

    public static void main(String argv[]) 
    { 
     final AliasProblemObject = new AliasProblem(); 
     final justAnInt localVar = AliasProblemObject.getVar(); 
     localVar.a = 19; 
     System.out.println("object: " + object.getVar().a); 
     System.out.println("local: " + localVar.a); 
    } 

} 
0

Tôi nghĩ rằng bạn có thể trở lại bản sao của dữ liệu đối tượng cho việc đọc và do đó bảo vệ chúng khỏi bị sửa đổi. Nhưng bản sao thêm có vẻ là một mức giá tuyệt vời cho việc không thay đổi.

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