2015-04-18 16 views
5

Nếu mã của tôi trả về Map<String, String>, nhưng có thể trống. Có lợi ích khi chuyển đổi nó để trả lại Optional<Map<String, String>>. Nó sẽ thêm bất kỳ lợi ích nào cho các trường hợp rỗng nhưng không phải là rỗng?Lợi ích thực sự của việc trả về <Bản đồ <Chuỗi, Chuỗi >> thay vì chỉ là một Bản đồ rỗng <String, String>

+3

Gần đây tôi đã có cuộc thảo luận về vấn đề này với đồng nghiệp. Nó đi xuống đến một vấn đề của ý kiến, tôi nghĩ rằng, tùy thuộc vào cách mạnh mẽ bạn tin vào Java 'Tùy chọn' như một đơn nguyên. Thực tế, tôi thích bản đồ trống hơn. –

+1

Huh, tôi rất khó để xem giá trị của một 'Tùy chọn >', cá nhân. Nhưng có lẽ tôi có thể bị thuyết phục. – yshavit

+4

Theo Brian Goetz bạn không nên sử dụng nó với Bộ sưu tập (và Bản đồ). Xem: http://stackoverflow.com/questions/26327957/should-java-8-getters-return-optional-type/26328555#26328555 – alfasin

Trả lời

9

Giống như rất nhiều đối tượng trong lập trình máy tính, Nó phụ thuộc (tm).

Cách tôi sử dụng tùy chọn là cách thay thế cho null (tóm lại). Một trong những advantages của nó là nó buộc người gọi phải xem xét rằng có thể không có một giá trị trả về, và rằng đây là một điều kiện hợp lệ ... Hãy xem xét những trích dẫn từ các câu trả lời liên kết ở trên:

sự vắng mặt của một giá trị là một công thức chính xác hơn rỗng

Bất kỳ người đọc mã hoặc tiêu dùng của bạn của API của bạn sẽ bị đánh đập trên người đứng đầu với thực tế là có thể không có gì ở đó và kiểm tra là cần thiết trước khi truy cập vào giá trị.

Vì vậy, khi tôi nhìn thấy kiểu trả về chữ ký Optional<Map<String, String>>, tôi nghĩ về nó như một kiểu trả về từ một chức năng mà một sản phẩm nào Map có thể là một giá trị trả về giá trị, nhưng như vậy là cả một thiếu một Map.

Ví dụ về này bao gồm getCachedFavoriteColors, findInvalidValuePairs, vv Trong trường hợp thứ nhất, có thể không có bất kỳ bất kỳ người dùng, mà sẽ trả về một sản phẩm nào Map - nhưng có thể không phải là một giá trị bộ nhớ cache, mà sẽ trả về một hợp lệ Optional . Trong trường hợp thứ hai, có thể không có bất kỳ cặp giá trị không hợp lệ nào, một lần nữa sẽ trả về một số trống rỗng Map, nhưng cũng có thể không phải là Invalidator. Bạn có được ý tưởng.

Lưu ý rằng trong một số trường hợp ở trên, bạn có thể muốn ném ngoại lệ thay vì trả về số Optional không hợp lệ. Đó là quyết định của bạn với tư cách là một nhà thiết kế API.

+1

Nhưng một Bản đồ có thể trống - bất kỳ người dùng nào của Bản đồ cũng nên biết điều đó, vì vậy nó đều bị đánh đập. Tôi không thấy giá trị bổ sung. Trên thực tế, bạn đã tạo _another_ "trạng thái trống" này. Bây giờ tham chiếu của bạn có thể là 'vắng mặt()', của một bản đồ trống, hoặc của một bản đồ không trống. Điều đó cho thấy một số khác biệt giữa hai trạng thái đầu tiên và có lẽ không quá rõ ràng về sự khác biệt đó (ngay cả trong ngữ cảnh của API). – yshavit

+7

Nhưng (và tất nhiên ý tưởng này cần phải được áp dụng một cách khôn ngoan cho thiết kế API): * thiếu các phần tử trong Bản đồ * khác với * không có Bản đồ *. Đây là tùy chọn thứ hai cho phép bạn thể hiện một cách súc tích. – thirtythreeforty

+2

Thật khó để nhớ để kiểm tra cả bản đồ rỗng và rỗng, đôi khi mọi người sẽ quên và cuối cùng lỗi thời gian chạy được ném. Với tùy chọn, bạn có thể ngưng tụ các kiểm tra cho các cấu trúc rỗng và rỗng nhưng được khởi tạo thành một lần kiểm tra duy nhất.Đó là những gì tôi sử dụng chúng cho, và nó chắc chắn làm cho việc kiểm tra lỗi dễ dàng hơn rất nhiều. – egracer

Các vấn đề liên quan