Tôi đến trễ trò chơi nhưng với giá trị của nó, tôi muốn thêm 2 Cents của mình. Họ đi ngược lại mục tiêu thiết kếOptional
, được tóm tắt tốt bằng câu trả lời của Stuart Marks , nhưng tôi vẫn bị thuyết phục về tính hợp lệ của chúng (rõ ràng).
Sử dụng tùy chọn ở mọi nơi
Nói chung
Tôi đã viết toàn bộ một bài đăng trên blog về việc sử dụngOptional
nhưng về cơ bản nó đi xuống:
- thiết kế các lớp học của bạn để tránh sự tùy chọn bất cứ nơi nào có thể khả thi
- trong tất cả các trường hợp còn lại, mặc định sẽ được sử dụng
Optional
thay vìnull
- có thể tạo ra ngoại lệ cho:
- biến cục bộ
- trả về giá trị và đối số cho phương thức riêng
- thực hiện các khối mã quan trọng (không cần đoán, sử dụng một trình lược tả)
Hai trường hợp ngoại lệ đầu tiên có thể làm giảm chi phí cảm nhận của việc đóng gói và hủy ghép các tham chiếu trong Optional
. Chúng được chọn sao cho một null không bao giờ có thể vượt qua một cách hợp pháp một ranh giới từ một thể hiện này sang một thể hiện khác.
Lưu ý rằng điều này hầu như sẽ không bao giờ cho phép Optional
s trong các bộ sưu tập gần như tệ như null
s. Đừng làm điều đó. ;)
Về câu hỏi của bạn
- Đúng.
- Nếu quá tải là không có tùy chọn, có.
- Nếu các phương pháp khác (phân lớp, trang trí, ...) không có lựa chọn, vâng.
- Xin đừng!
Ưu điểm
Làm điều này làm giảm sự hiện diện của null
s trong cơ sở mã của bạn, mặc dù nó không xóa chúng. Nhưng đó thậm chí không phải là điểm chính. Có những lợi thế quan trọng khác:
Làm rõ ý định
Sử dụng Optional
rõ ràng thể hiện rằng các biến là, tốt, tùy chọn. Bất kỳ người đọc mã hoặc người tiêu dùng API nào của bạn sẽ bị đánh vào đầu với thực tế là có thể không có gì ở đó và việc kiểm tra là cần thiết trước khi truy cập giá trị.
Loại bỏ sự không chắc chắn
Không có Optional
ý nghĩa của một null
sự xuất hiện là không rõ ràng. Nó có thể là một đại diện pháp lý của một tiểu bang (xem Map.get
) hoặc một lỗi thực thi như khởi tạo bị thiếu hoặc thất bại.
Điều này thay đổi đáng kể với việc sử dụng liên tục Optional
. Ở đây, đã có sự xuất hiện của null
dấu hiệu cho thấy sự hiện diện của một lỗi. (Bởi vì nếu giá trị được phép bị thiếu, một giá trị Optional
sẽ được sử dụng.) Điều này làm cho việc gỡ lỗi một ngoại lệ con trỏ null dễ dàng hơn nhiều vì câu hỏi về ý nghĩa của điều này null
đã được trả lời.
Thêm kiểm tra Null
Bây giờ không còn gì có thể null
nữa, điều này có thể được thi hành ở mọi nơi. Cho dù với chú thích, xác nhận hoặc kiểm tra đơn giản, bạn không bao giờ phải suy nghĩ về việc đối số này hoặc loại trả về có thể là null. Không thể nào!
Nhược điểm
Tất nhiên, không có viên đạn bạc ...
Hiệu suất
Gói các giá trị (đặc biệt là nguyên thủy) vào một thể hiện bổ sung có thể làm giảm hiệu suất. Trong các vòng lặp chặt chẽ, điều này có thể trở nên đáng chú ý hoặc thậm chí tệ hơn.
Lưu ý rằng trình biên dịch có thể tránh được tham chiếu thêm trong vòng đời ngắn của Optional
s. Trong các loại giá trị Java 10 có thể tiếp tục giảm hoặc xóa hình phạt.
Tuần tự hóa
Optional
không được tuần tự hóa nhưng một cách giải quyết không quá phức tạp.
Bất biến
Do sự bất biến của các kiểu chung trong Java, các hoạt động nhất định trở nên cồng kềnh khi loại giá trị thực được đẩy vào một đối số kiểu chung. Một ví dụ được đưa ra ở đây (xem "Đa hình tham số") .
Map<Character, String>
. Nếu không có sự thay thế tôi có thể sử dụng điều này :Optional.ofNullable(map.get(c)).orElse(String.valueOf(c))
. Cũng lưu ý rằng Tùy chọn đã bị đánh cắp từ Guava và nó có cú pháp đẹp hơn nhiều:Optional.fromNullable(map.get(c)).or(String.valueOf(c));