Nếu một tham chiếu đối tượng được chuyển đến một phương thức, có thể đặt đối tượng "Chỉ Đọc" cho phương thức không?Có thể tạo một đối tượng "Chỉ Đọc" cho một phương thức
Trả lời
Không nói đúng. Đó là, một tham chiếu có thể biến đổi một đối tượng không thể được biến thành một tham chiếu mà không thể biến đổi một đối tượng. Ngoài ra, không có cách nào để thể hiện rằng một loại không thay đổi hoặc có thể thay đổi được, ngoài việc sử dụng các quy ước.
Tính năng duy nhất đảm bảo một số hình thức bất biến sẽ là các trường final
- khi đã viết chúng không thể sửa đổi được.
Điều đó nói rằng, có nhiều cách để thiết kế các lớp học để đột biến không mong muốn được ngăn chặn. Dưới đây là một số kỹ thuật:
Defensive Copying. Vượt qua một bản sao của đối tượng, để nếu nó bị đột biến, nó không phá vỡ các bất biến nội tại của bạn.
Sử dụng các công cụ sửa đổi truy cập và/hoặc giao diện để hiển thị chỉ các phương pháp chỉ đọc. Bạn có thể sử dụng công cụ sửa đổi truy cập (
public
/private
/protected
), có thể được kết hợp với giao diện để chỉ một số phương thức nhất định hiển thị với đối tượng khác. Nếu các phương pháp tiếp xúc là bản chất chỉ đọc, bạn sẽ an toàn.Làm cho đối tượng của bạn không thay đổi theo mặc định. Bất kỳ thao tác nào trên đối tượng đều trả về một bản sao của đối tượng.
Ngoài ra, lưu ý rằng API trong SDK đôi khi có phương thức trả lại phiên bản không thể thay đổi của một đối tượng, ví dụ: Collections.unmodifiableList
. Một nỗ lực để thay đổi một danh sách bất biến sẽ ném một ngoại lệ. Điều này không thực thi bất biến tĩnh (tại thời gian biên dịch với hệ thống kiểu tĩnh), nhưng là một cách rẻ tiền và hiệu quả để thực thi nó một cách năng động (vào thời gian chạy).
Đã có nhiều đề xuất nghiên cứu về phần mở rộng Java để kiểm soát tốt hơn tính năng răng cưa và khả năng truy cập.Ví dụ: thêm từ khóa readonly
. Không ai trong số họ là xa như tôi biết kế hoạch để đưa vào phiên bản tương lai của Java. Bạn có thể có một cái nhìn tại các gợi ý nếu bạn quan tâm:
- Why We Should Not Add ''Read-Only'' to Java (yet) - nó sẽ liệt kê và so sánh hầu hết các kiến nghị
- The Checker Framework: Custom pluggable types for Java - một cách không xâm nhập để mở rộng hệ thống kiểu, đặc biệt là với bất biến loại.
Khung kiểm tra rất thú vị. Trong khung kiểm tra, xem xét bộ kiểm tra loại vũ trụ chung, trình kiểm tra bất biến IGJ và trình kiểm tra bất biến Javari. Khung làm việc bằng cách sử dụng chú thích, vì vậy nó không phải là xâm nhập.
pdf chỉ đọc bị thối liên kết. – flup
No. Nhưng bạn có thể cố gắng sao chép đối tượng trước khi truyền, vì vậy mọi thay đổi được thực hiện bởi phương pháp sẽ không ảnh hưởng đến đối tượng ban đầu.
Không, không phải không trang trí, ghép, nhân bản, v.v.
Không có cơ chế chung cho điều đó. Bạn sẽ cần phải viết mã trường hợp đặc biệt để đạt được nó, như viết một wrapper không thay đổi (xem Collections.unmodifiableList
).
Bạn có thể xác định tất cả các tham số của đối tượng là final
nhưng điều đó làm cho đối tượng chỉ đọc cho tất cả mọi người.
Bạn có thể đạt được một điều tương tự như trong hầu hết các trường hợp bằng cách nhân bản Object
là tuyên bố đầu tiên của phương pháp, như thế này ...
public void readOnlyMethod(Object test){
test = test.clone();
// other code here
}
Vì vậy, nếu bạn gọi readOnlyMethod()
và vượt qua trong bất kỳ Object
, một bản sao của Object
sẽ được thực hiện. Bản sao sử dụng cùng tên với tham số của phương thức, vì vậy không có nguy cơ vô tình thay đổi Object
gốc.
Điều này yêu cầu đối tượng thực sự thực hiện 'clone' đúng cách và vì đây là API có chức năng chỉnh sửa, các lớp hiện đại hiếm khi bận tâm với nó. –
Chính xác. Tuy nhiên, tôi hy vọng rằng hầu hết các lớp Java cốt lõi nên triển khai thực hiện 'clone()' đúng cách, vì vậy điều này sẽ bao gồm * hầu hết * các tình huống. Nó có lẽ gần như là bạn sẽ nhận được một tham số chỉ đọc – wattostudios
Làm thế nào về 'Collections.unmodifiableList' - đó là từ API lõi (không nhân bản). –
Tùy thuộc vào nơi bạn muốn quy tắc được thực thi. Nếu bạn đang làm việc cộng tác trên một dự án, hãy sử dụng final
với nhận xét cho người tiếp theo họ không có ý định sửa đổi giá trị này. Nếu không, bạn sẽ không chỉ cần viết phương thức để không phải chạm vào đối tượng?
public static void main(String[] args) {
cantTouchThis("Cant touch this");
}
/**
*
* @param value - break it down
*/
public static void cantTouchThis(final String value) {
System.out.println("Value: " + value);
value = "Nah nah nah nah"; //Compile time error
}
Vì vậy, cụ thể cho phương pháp này, giá trị sẽ không bao giờ được ghi vào và được thực thi tại thời gian biên dịch làm cho giải pháp cực kỳ mạnh mẽ. Bên ngoài phạm vi của phương pháp này, đối tượng vẫn không thay đổi gì mà không phải tạo bất kỳ loại trình bao bọc nào.
private boolean isExecuteWriteQueue = false;
public boolean isWriting(){
final boolean b = isExecuteWriteQueue;
return b;
}
làm cho nó triển khai giao diện chỉ đọc các phương thức (không có phương thức setter) cho bản sao đối tượng (bản sao chỉ đường) và trả về phiên bản giao diện chỉ đọc thay vì trả về phiên bản một đối tượng chính nó
- 1. có thể tham số phương thức truyền đối tượng theo tham chiếu nhưng chỉ đọc không?
- 2. Tôi có thể chuyển đối tượng kiểu cho một phương thức chung không?
- 3. Trong PHP, bạn có thể khởi tạo một đối tượng và gọi một phương thức trên cùng một dòng không?
- 4. Có thể sao chép phương thức tạo đối tượng bằng cách sử dụng hàm tạo
- 5. Gọi một phương thức trên một đối tượng
- 6. Cửa sổ bật lên AngularJS bootstrap với một chỉ thị khác [đối tượng đối tượng] không có phương thức 'popover'
- 7. C# đối tượng chỉ đọc
- 8. Tạo một phương thức đồng thời là một thể hiện và phương thức lớp
- 9. Ghi đè một phương thức trong một đối tượng Java đã được khởi tạo
- 10. Làm thế nào tôi có thể khởi tạo một đối tượng chỉ biết tên của nó?
- 11. Mockito - Đặt một phương thức của đối tượng được trả về bằng phương thức đối tượng giả
- 12. Kiểm tra xem một thể hiện của một đối tượng là chỉ đọc
- 13. LINQ Có phương pháp cho một đối tượng
- 14. jquery $ .each cung cấp cho tôi một đối tượng không có phương thức hasClass
- 15. C#: Trả về một đại biểu cho một đối tượng và tên phương thức
- 16. Có thể sử dụng bộ khởi tạo đối tượng C# với phương thức nhà máy không?
- 17. Tạo các hàm cho một đối tượng trong javascript
- 18. Trọng một phương pháp trong các đối tượng tĩnh tạo
- 19. gì một phương thức toString tốt cho một đối tượng deftype'd trong clojure
- 20. Tạo một thể hiện đối tượng unconstructed
- 21. Thêm phương thức vào một đối tượng được sao chép
- 22. Làm thế nào để bạn tạo một phương thức cho một đối tượng tùy chỉnh trong JavaScript?
- 23. Tạo đối tượng: Constructors hoặc phương thức nhà máy tĩnh
- 24. Phạm vi Java: Trả về một đối tượng được khởi tạo bên trong một phương thức - Có nguy hiểm không?
- 25. Xây dựng một phương thức xây dựng đối tượng tĩnh so với phương thức mở rộng
- 26. Loại vô íchLỗi: Đối tượng [đối tượng đối tượng] không có phương thức 'có thể kéo'. (Booklet jquery plugin)
- 27. Tạo một tham chiếu yếu cho một đối tượng
- 28. Phương thức init gọi Guice sau khi khởi tạo một đối tượng
- 29. Làm thế nào tôi có thể kiểm tra một đối tượng bên trong một phương thức trong Objective-C?
- 30. Tạo cây định nghĩa phương thức từ biểu tượng phương thức và một nội dung
có một tài nguyên cũ nhưng vẫn tốt: http://www.cs.uwm.edu/~boyland/papers/readonly-talk.pdf –
lưu trữ tham chiếu đến đối tượng, sao chép nó và so sánh theo thời gian nếu không có gì thay đổi? –