Tôi đã triển khai một lớp bằng Java, trong đó, lưu trữ một danh sách . Tôi muốn lớp học không thay đổi. Tuy nhiên, tôi cần thực hiện các thao tác trên dữ liệu nội bộ không có ý nghĩa trong ngữ cảnh của lớp. Do đó, tôi có một lớp khác định nghĩa một tập các thuật toán. Dưới đây là một ví dụ đơn giản:Đối tượng không thể thay đổi trong Java và truy cập dữ liệu
Wrapper.java
import java.util.List;
import java.util.Iterator;
public class Wrapper implements Iterable<Double>
{
private final List<Double> list;
public Wrapper(List<Double> list)
{
this.list = list;
}
public Iterator<Double> iterator()
{
return getList().iterator();
}
public List<Double> data() { return getList(); }
}
Algorithm.java
import java.util.Iterator;
import java.util.Collection;
public class Algorithm
{
public static double sum(Collection<Double> collection)
{
double sum = 0.0;
Iterator<Double> iterator = collection.iterator();
// Throws NoSuchElementException if the Collection contains no elements
do
{
sum += iterator.next();
}
while(iterator.hasNext());
return sum;
}
}
Bây giờ, câu hỏi của tôi là, là có một cách đáng tin cậy để tránh người khác sửa đổi dữ liệu nội bộ của tôi mặc dù lớp học của tôi có nghĩa là không thay đổi? Mặc dù tôi đã cung cấp phương thức dữ liệu() cho mục đích chỉ đọc, không có gì để ngăn ai đó sửa đổi dữ liệu qua các phương pháp như xóa() và xóa(). Bây giờ, tôi nhận ra rằng tôi có thể cung cấp quyền truy cập vào dữ liệu của mình độc quyền thông qua trình lặp. Tuy nhiên, tôi đã được thông báo rằng việc chuyển một Bộ sưu tập là một điển hình. Thứ hai, nếu tôi có một thuật toán yêu cầu nhiều hơn một lần vượt qua dữ liệu, tôi sẽ phải cung cấp nhiều vòng lặp, có vẻ như một độ dốc trơn trượt.
Được rồi, hy vọng có một giải pháp đơn giản sẽ giải quyết được những lo ngại của tôi. Tôi chỉ đang trở lại Java, và không bao giờ xem xét những điều này trước khi giao dịch với const bằng C++. Cảm ơn trước!
Oh! Có một điều nữa tôi chỉ nghĩ đến. Tôi thực tế không thể trả lại bản sao của Danh sách nội bộ. Danh sách thường chứa hàng trăm nghìn phần tử.
Hoàn hảo! Tôi không thấy điều này. Cảm ơn bạn. –
Bạn vẫn phải chăm sóc cách thức đối tượng Wrapper được tạo ra: vì Danh sách được truyền cho hàm tạo, có thể có các tham chiếu đến nó ở một nơi khác trong mã. Nếu bạn muốn Trình bao bọc thực sự không thay đổi được, bạn sẽ phải sao chép nội dung của danh sách. –