Không khai báo giao diện cho các đối tượng bất biến
[EDIT] Trường hợp các đối tượng trong câu hỏi đại diện cho Đối tượng truyền dữ liệu (DTO) hoặc Dữ liệu cũ đơn giản (POD)
Đó có phải là một hướng dẫn hợp lý?
Cho đến nay, tôi thường tạo giao diện cho các lớp kín không thay đổi (dữ liệu không thể thay đổi). Tôi đã cố gắng cẩn thận để không sử dụng giao diện bất cứ nơi nào tôi quan tâm đến sự bất biến.
Thật không may, giao diện bắt đầu tràn ngập mã (và đó không chỉ là mã của tôi mà tôi lo lắng). Bạn kết thúc việc được thông qua một giao diện, và sau đó muốn chuyển nó đến một mã nào đó thực sự muốn cho rằng thứ được truyền cho nó là bất biến.
Vì vấn đề này, tôi đang cân nhắc không bao giờ khai báo giao diện cho các đối tượng bất biến.
Điều này có thể có sự phân nhánh đối với Kiểm thử đơn vị, nhưng ngoài ra, điều này có vẻ là một hướng dẫn hợp lý?
Hoặc có một mẫu nào khác mà tôi nên sử dụng để tránh sự cố "giao diện trải rộng" mà tôi đang gặp?
(Tôi đang sử dụng các đối tượng không thay đổi này vì nhiều lý do: Chủ yếu là vì sự an toàn của luồng vì tôi viết rất nhiều mã đa luồng; nhưng cũng vì điều đó có nghĩa là tôi có thể tránh tạo các bản sao phòng thủ của các đối tượng được truyền cho các phương thức. Mã trở nên đơn giản hơn rất nhiều nhiều trường hợp khi bạn biết một thứ gì đó là bất biến - mà bạn không biết nếu bạn đã được giao một giao diện. Thực tế, bạn thường không thể tạo một bản sao phòng thủ của một đối tượng được tham chiếu qua giao diện nếu nó không cung cấp hoạt động nhân bản hoặc bất kỳ cách nào để tuần tự hóa nó ...)
[CHỈNH SỬA]
Để cung cấp nhiều ngữ cảnh hơn cho lý do tôi muốn làm cho các đối tượng trở nên bất biến, hãy xem bài đăng trên blog này từ Eric Lippert:
http://bloss.msdn.com/b/ericlippert/archive/tags/immutability/
Tôi cũng nên chỉ ra rằng tôi đang làm việc với một số khái niệm cấp thấp hơn ở đây, chẳng hạn như các mục đang bị thao túng / chuyển xung quanh trong hàng đợi công việc đa luồng. Đây thực chất là các DTO.
Ngoài ra Joshua Bloch khuyên bạn nên sử dụng các đối tượng bất biến trong cuốn sách Java hiệu quả .
Theo sát
Cảm ơn về tất cả các phản hồi. Tôi đã quyết định đi trước và sử dụng hướng dẫn này cho DTO và ilk của họ. Nó hoạt động tốt cho đến nay, nhưng chỉ mới được một tuần ... Tuy nhiên, nó trông vẫn ổn.
Có một số vấn đề khác liên quan đến vấn đề này mà tôi muốn hỏi về; đáng chú ý là một cái gì đó tôi đang gọi là "Bất biến sâu hoặc nông" (danh pháp tôi đã đánh cắp từ nhân bản Deep và Shallow) - nhưng đó là một câu hỏi cho một thời điểm khác.
List<Number>
mà có thể giữ Integer
, Float
, Long
, BigDecimal
, vv ... Tất cả những điều là không thay đổi bản thân.