Với Java, để truy cập an toàn tham chiếu lồng nhau sâu như a.b.c.d.e
, chúng tôi thường phải chỉ định kiểm tra rỗng ở mỗi cấp hoặc gói trong Optional
s và sử dụng orElse()
.Cách thay thế cho Null Coalescing Operator
public <T> T valueOrNull(Supplier<T> expression) {
try {
return expression.get();
} catch (NullPointerException e) {
return null;
}
}
này sau đó có thể được sử dụng một cách an toàn với value = valueOrNull(() -> a.b.c.d.e)
: (Không giống với các ngôn ngữ như Kotlin/C# nơi a?.b?.c?.d?.e
hoặc các sản phẩm tương tự
Tôi đã tự hỏi nếu phương pháp helper sau đây có thể là một lựa chọn hợp lý..
Lưu ý: Tôi hiểu rằng việc bắt giữ NullPointerException
s thường bị cau mày vì lý do hiệu suất và hơn thế nữa, nhưng tự hỏi liệu việc sử dụng ở đây có phải là một ngoại lệ hợp lý hay không.
Việc nắm bắt 'NullPointerExceptions' có rất ít việc phải làm với hiệu suất và rất nhiều việc phải làm với chất lượng mã chung. – Kayaman
Người ta thậm chí có thể lập luận rằng phải viết 'abcde' (hoặc' a? .b? .c? .d? .e') đã cho biết thiết kế không rõ ràng (không phải tôi sẽ không chào đón một nhà điều hành như vậy, nhưng tôi có xu hướng nhận được ít làm tổ hơn thế). – Kayaman
@Kayaman Tôi đã đề cập đến hiệu suất vì sử dụng ngoại lệ cho luồng điều khiển thường chậm hơn nhiều so với phân nhánh đơn giản. Và chất lượng mã sẽ không phải là một vấn đề nếu điều này bị cô lập chỉ với phương pháp này. Về nhận xét thứ hai của bạn, điều này có thể đúng trong hầu hết các trường hợp, nhưng hãy xem xét một POJO đại diện cho một lược đồ XML, nơi bạn sử dụng JAXB hoặc một số cho chuyển đổi. Đó là hợp lệ để có quyền truy cập vào một nút xml lồng nhau sâu nơi bạn không thể chắc chắn về tính hợp lệ của đường dẫn. – Naufal