2017-10-02 60 views
5

Java 9 giới thiệu các phương pháp requireNonNullElserequireNonNullElseGet cho lớp Objects. Những chức năng này có khác biệt với phương pháp Optional.ofNullable()orElse()orElseGet() không?Sự khác nhau giữa Objects.requireNonNullElse() và Optional.ofNullable(). OrElse() là gì?

String foo = null; 
Objects.requireNonNullElse(foo, "nonNull");//returns the string "nonNull" 
Optional.ofNullable(foo).orElse("nonNull");//also returns the string "nonNull" 

Nếu không có sự khác biệt về chức năng, tại sao Objects được thêm vào bây giờ?

Trả lời

5

Có một khác biệt nhỏ trong hành vi của chúng. Objects.requireNonNullElse() yêu cầu một trong các tham số không phải là null, nếu không thì NullPointerException sẽ bị ném.

String foo = null, bar = null; 
Optional.ofNullable(foo).orElse(bar);//returns a null value 
Objects.requireNonNullElse(foo, bar);//throws a NullPointerException 
+3

Ngoài ra còn có sự khác biệt không có chức năng nhỏ rằng 'phiên bản Optional' tạo ra rác * (trừ khi JIT đủ thông minh để tối ưu hóa nó đi) *. – Andreas

+3

@Andreas JMH báo cáo không có sự khác biệt phân bổ giữa 'Optional.ofNullable(). OrElse()' và 'Objects.requireNonNullElse()' – ZhekaKozlov

+0

@ZhekaKozlov Chỉ khi 'foo' là' null', trong trường hợp này 'ofNullable() 'trả về trường hợp * rỗng trống *. Bạn đã thử JMH với một 'null' không null? Bởi vì tôi đã lấy câu hỏi như yêu cầu sự khác biệt chức năng là gì giữa hai cho * bất kỳ * giá trị, không chỉ là giá trị 'null'. – Andreas

3

Sự khác biệt về khái niệm giữa việc chọn cái khác được giải thích trong tài liệu của họ. Nó dựa trên cách tiếp cận của một người tiêu dùng API để chọn một trong số họ được cho là được sử dụng hiệu quả bởi họ.

Optional là đối tượng chứa có thể chứa hoặc không chứa giá trị không null.

Biến có loại là Optional không bao giờ nên là null; nó phải luôn trỏ đến một phiên bản Optional.

Đây là lớp dựa trên giá trị; sử dụng các hoạt động nhạy cảm với danh tính (bao gồm cả bình đẳng tham chiếu (==), mã băm nhận dạng, hoặc đồng bộ) trên các trường hợp Tùy chọn có thể có kết quả không thể đoán trước và cần tránh.

  • ofNullable

    trả về một Optional với giá trị hiện tại nếu giá trị quy định là không null, nếu không một trống Optional

  • orElse

    trả về giá trị nếu hiện tại nếu không, trả về khác.

Do đó các hành vi sau đây:

String foo = null; 
=> Optional.ofNullable(foo).orElse("nonNull") 
=> Optional.ofNullable(null).orElse("nonNull") 
=> Optional.empty().orElse("nonNull") 
=> return otherwise "nonNull" 

giống như nó đi qua

String foo = null, bar = null; 
=> Optional.ofNullable(foo).orElse(bar); 
=> Optional.ofNullable(null).orElse(bar); 
=> Optional.empty().orElse(bar) 
=> return otherwise 'bar' 
=> returns null 

Objects là một lớp học bao gồm phương pháp hữu ích tĩnh cho hoạt động trên 01 Các đối tượnghoặc kiểm tra các điều kiện nhất định trước khi vận hành.

Những tiện ích này bao gồm các phương pháp null-an toàn hoặc null-tolerant cho tính mã băm của một đối tượng, trả lại một chuỗi cho một đối tượng , so sánh hai đối tượng, và kiểm tra nếu chỉ số hoặc tiểu tầm Giá trị vượt quá giới hạn.

  • requireNonNullElse

    lợi nhuận đối số đầu tiên nếu nó là không null và nếu không đối số thứ hai nếu nó là không null

Do đó sự khác biệt trong hành vi:

String foo = null; 
=> Objects.requireNonNullElse(foo, "nonNull") 
=> Objects.requireNonNullElse(null, "nonNull"); 

đó tiếp tục đánh giá nội bộ nếu requireNonNull("nonNull", "defaultObj") và sau đó

=> returns "nonNull" since its a non-null value 

bây giờ vì nó đi qua

String foo = null, bar = null; 
=> Objects.requireNonNullElse(foo, bar); 
=> Objects.requireNonNullElse(null, bar); 

Nó kiểm tra nội bộ nếu requireNonNull(bar, "defaultObj") mà sau đó

=> throws a NullPointerException 

Như ghi nhận cũng

throws NullPointerException - nếu cả hai obj là null defaultObj là null

Các vấn đề liên quan