Tôi có một đối tượng lưu trữ một số dữ liệu trong danh sách. Việc triển khai có thể thay đổi sau đó và tôi không muốn hiển thị việc triển khai nội bộ cho người dùng cuối. Tuy nhiên, người dùng phải có khả năng sửa đổi và truy cập bộ sưu tập dữ liệu này. Hiện tại tôi có nội dung như sau:Sử dụng Danh sách hoặc Bộ sưu tập có tốt hơn không?
public List<SomeDataType> getData() {
return this.data;
}
public void setData(List<SomeDataType> data) {
this.data = data;
}
Điều này có nghĩa là tôi đã cho phép các chi tiết triển khai nội bộ bị rò rỉ không? Tôi có nên làm việc này thay thế không?
public Collection<SomeDataType> getData() {
return this.data;
}
public void setData(Collection<SomeDataType> data) {
this.data = new ArrayList<SomeDataType>(data);
}
Một điều cần lưu ý là nếu bạn trả lại bộ sưu tập hoặc danh sách thực tế như vậy, bạn cho phép người khác làm bất cứ điều gì họ muốn, bao gồm xóa các mục hoặc thậm chí xóa toàn bộ nội dung. Bạn có thể nên trả lại một trình bao bọc không thể thay đổi hoặc bản sao của danh sách. –
@PaulTomblin đúng, nhưng chi phí quá mức và nhân tạo cho hệ thống. Unmodifiable wrappers có ý nghĩa khi làm việc với các đối tượng được quản lý bởi middleware persistency, và thậm chí chỉ trong những trường hợp hiếm hoi. – comeGetSome
@comeGetSome, đó là lý do tại sao tôi nói "có thể" thay vì "phải". Nó sẽ phụ thuộc vào trường hợp sử dụng - nếu tôi đang tạo API cho người khác sử dụng, tôi sẽ trả về một bản sao hoặc một trình bao bọc. Nếu nó là cho bản thân tôi hoặc cho các đồng nghiệp đáng tin cậy, tôi sẽ đặt một "KHÔNG CHỊU ĐIỀU CHỈNH GIÁ TRỊ NÀY" trong javadocs và để nó ở đó. –