Không sử dụng null, sử dụng Tùy chọn
Như bạn đã chỉ ra, một trong những vấn đề lớn nhất null
trong Java là nó có thể được sử dụng ở mọi nơi hoặc ít nhất là cho tất cả các loại tham chiếu.
Không thể nói điều đó có thể null
và những gì không thể.
Java 8 giới thiệu một mẫu tốt hơn nhiều : Optional
.
Và ví dụ từ Oracle:
String version = "UNKNOWN";
if(computer != null) {
Soundcard soundcard = computer.getSoundcard();
if(soundcard != null) {
USB usb = soundcard.getUSB();
if(usb != null) {
version = usb.getVersion();
}
}
}
Nếu mỗi trong số này có thể hoặc không thể trả về giá trị thành công, bạn có thể thay đổi API thành Optional
s:
String name = computer.flatMap(Computer::getSoundcard)
.flatMap(Soundcard::getUSB)
.map(USB::getVersion)
.orElse("UNKNOWN");
Bằng cách mã hóa rõ ràng tùy chọn trong loại, giao diện của bạn sẽ tốt hơn nhiều và mã của bạn sẽ sạch hơn.
Nếu bạn không sử dụng Java 8, bạn có thể xem com.google.common.base.Optional
trong Google Guava.
Một lời giải thích tốt của nhóm Guava: https://github.com/google/guava/wiki/UsingAndAvoidingNullExplained
Một lời giải thích tổng quát hơn về những bất lợi đối với null, với các ví dụ từ một số ngôn ngữ: https://www.lucidchart.com/techblog/2015/08/31/the-worst-mistake-of-computer-science/
@Nullull, @Nullable
Java 8 thêm các chú thích này để giúp các công cụ kiểm tra mã như IDE gặp vấn đề. Họ khá hạn chế về hiệu quả của họ.
Kiểm tra khi nó có ý nghĩa
Đừng viết 50% mã của bạn kiểm tra null, đặc biệt nếu không có gì hợp lý mà mã của bạn có thể làm với một null
giá trị.
Mặt khác, nếu null
có thể được sử dụng và có nghĩa là một cái gì đó, hãy chắc chắn để sử dụng nó.
Cuối cùng, rõ ràng bạn không thể xóa null
khỏi Java. Tôi thực sự khuyên bạn nên thay thế sự Optional
trừu tượng bất cứ khi nào có thể, và kiểm tra null
những thời điểm khác để bạn có thể làm điều gì đó hợp lý về nó.