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 nulltrong 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ể nullvà 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 Optionals:
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.Optionaltrong 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 nullgiá trị.
Mặt khác, nếu nullcó 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 nullkhỏi Java. Tôi thực sự khuyên bạn nên thay thế sự Optionaltrừu tượng bất cứ khi nào có thể, và kiểm tra nullnhững thời điểm khác để bạn có thể làm điều gì đó hợp lý về nó.