Chức năng trả về "quyền sở hữu độc quyền" của các đối tượng có thể thay đổi mới được tạo nên thường là loại thực tế nhất; những thứ trả về các đối tượng bất biến, đặc biệt nếu chúng có thể được chia sẻ, thường sẽ trả về các loại ít cụ thể hơn.
Lý do để phân biệt là trong trường hợp trước đây, một đối tượng sẽ luôn có thể tạo ra một đối tượng mới của loại được chỉ định và vì người nhận sẽ sở hữu đối tượng và không cho biết hành động của người nhận để thực hiện, nói chung sẽ không có cách nào để mã trả về đối tượng để biết liệu có bất kỳ triển khai giao diện thay thế nào có thể đáp ứng nhu cầu của người nhận hay không.
Trong trường hợp thứ hai, thực tế là đối tượng không thay đổi có nghĩa là hàm có thể xác định loại thay thế có thể làm mọi thứ phức tạp hơn có thể làm cho nội dung chính xác. Ví dụ: giao diện Immutable2dMatrix
có thể được triển khai bởi lớp ImmutableArrayBacked2dMatrix
và lớp ImmutableDiagonal2dMatrix
. Một hàm có nghĩa vụ trả về một hình vuông Immutable2dMatrix
có thể quyết định trả lại một phiên bản ImmutableDiagonalMatrix
nếu tất cả các phần tử nằm ngoài đường chéo chính xảy ra bằng 0 hoặc ImmutableArrayBackedMatrix
nếu không. Loại cũ sẽ mất không gian lưu trữ ít hơn nhiều, nhưng người nhận không nên quan tâm đến sự khác biệt giữa chúng.
Trả lại Immutable2dMatrix
thay vì một bê tông ImmutableArrayBackedMatrix
cho phép mã để chọn loại trả về dựa trên những gì mảng chứa; nó cũng có nghĩa là nếu mã được cho là sẽ trả về mảng xảy ra là đang nắm giữ việc thực hiện phù hợp Immutable2dMatrix
nó có thể đơn giản trả về điều đó, thay vì phải xây dựng một cá thể mới. Cả hai yếu tố này có thể là "thắng" lớn khi làm việc với các vật thể bất biến. Tuy nhiên,
Tuy nhiên, khi làm việc với các đối tượng có thể thay đổi được, cả hai yếu tố đều không được phát. Thực tế là một mảng có thể thay đổi có thể không có bất kỳ phần tử nào trên đường chéo chính khi nó được tạo ra không có nghĩa là nó sẽ không bao giờ có bất kỳ phần tử nào như vậy. Do đó, trong khi ImmutableDiagonalMatrix
là một loại phụ có hiệu quả là Immutable2dMatrix
, một số MutableDiagonalMatrix
không phải là loại phụ của một số Mutable2dMatrix
, vì sau này có thể chấp nhận các cửa hàng ở đường chéo chính trong khi trường hợp cũ không thể. Hơn nữa, trong khi các đối tượng bất biến thường có thể và nên được chia sẻ, các đối tượng có thể thay đổi thường không thể. Một hàm được yêu cầu cho bộ sưu tập có thể thay đổi mới được khởi tạo với nội dung nhất định sẽ cần tạo bộ sưu tập mới cho dù cửa hàng sao lưu có khớp với loại được yêu cầu hay không.
Từ Javadoc: "_Trả lại danh sách mảng [...] _". Tại sao họ quyết định khóa API để trả về một 'ArrayList' là uinknown, và chúng ta không thể trả lời câu hỏi này, ngay cả khi nhìn vào mã nguồn của' Bộ sưu tập'. – Laf
có thể là do lệnh của các enums phải được duy trì? nó được đề cập trong liên kết trong câu hỏi của bạn, _Trả lại một danh sách mảng chứa các phần tử được trả về theo kiểu liệt kê được chỉ định theo thứ tự chúng được trả về bởi enumeration_ –
@ Amit.rk3 a [List] (http://docs.oracle.com /javase/7/docs/api/java/util/List.html) luôn giữ thứ tự bất kỳ việc triển khai nào bạn chọn. –