Kể từ JDK 7 Tôi đã vui vẻ sử dụng phương pháp này nó giới thiệu để từ chối null
giá trị được truyền cho một phương pháp mà không thể chấp nhận chúng:Là Objects.requireNonNull kém hiệu quả hơn so với cách cũ?
private void someMethod(SomeType pointer, SomeType anotherPointer) {
Objects.requireNonNull(pointer, "pointer cannot be null!");
Objects.requireNonNull(anotherPointer, "anotherPointer cannot be null!");
// Rest of method
}
Tôi nghĩ rằng phương pháp này làm cho mã rất gọn gàng mà rất dễ dàng để đọc, và tôi đang cố khuyến khích các đồng nghiệp sử dụng nó. Nhưng một (đặc biệt là kiến thức) đồng nghiệp là kháng, và nói rằng theo cách cũ là hiệu quả hơn:
private void someMethod(SomeType pointer, SomeType anotherPointer) {
if (pointer == null) {
throw new NullPointerException("pointer cannot be null!");
}
if (anotherPointer == null) {
throw new NullPointerException("anotherPointer cannot be null!");
}
// Rest of method
}
Ông nói rằng gọi requireNonNull
bao gồm việc đặt một phương pháp khác trên cuộc gọi JVM chồng và sẽ dẫn đến hiệu suất tồi tệ hơn một đơn giản == null
kiểm tra.
Vì vậy, câu hỏi của tôi: có bất kỳ bằng chứng của một hình phạt hiệu suất đang phát sinh bằng cách sử dụng các phương pháp Objects.requireNonNull
?
No. Không. Đồng nghiệp "hiểu biết" của bạn rõ ràng không phải là kiến thức như (s) ông nghĩ. Bất cứ tác động nào về hiệu suất nó có thể có là không đáng kể và rất có thể sẽ được JIT gạch chân nếu nó phát hiện ra rằng phương pháp này được sử dụng nhiều. –
JIT sẽ vui vẻ nội tuyến các cuộc gọi phương thức đó. Bạn nên nhớ quy tắc tối ưu đầu tiên cho padawan cũ của bạn: * không *. Anh ta nên là người chứng minh rằng lời gọi phương thức này là nguyên nhân của một vấn đề quan trọng trước khi buộc mọi người phải tạo ra mã ít đọc được hơn. –
[Lỗi OpenJDK 8073479] (https://bugs.openjdk.java.net/browse/JDK-8073479) đã chuyển đổi phương thức 'foo.getClass()' của JDK để sử dụng 'Objects.requireNonNull' thay vào đó, tuyên bố không có hiệu suất suy thoái và đôi khi một sự cải thiện. –