java.util.Objects.isNull so với đối tượng == null


88

Như bạn biết, java.util.Objects

Lớp này bao gồm các phương thức tiện ích tĩnh để hoạt động trên các đối tượng.

Một trong những phương pháp như vậy là Objects.isNull().

Sự hiểu biết của tôi là điều đó Objects.isNull()sẽ loại bỏ cơ hội vô tình gán giá trị null cho đối tượng bằng cách bỏ qua thứ hai =.

Tuy nhiên, Ghi chú API nêu rõ:

Phương thức này tồn tại để được sử dụng như một vị từ, bộ lọc (Objects :: isNull)

Nên có bất kỳ lý do / hoàn cảnh mà tôi nên sử dụng object == nullhơn Objects.isNull()trong một câu lệnh if ?

Nên Objects.isNull()giới hạn dành riêng cho Dự đoán?


3
Nếu tất cả các bạn đang lo lắng là tình cờ chuyển nhượng, bạn chỉ có thể sử dụng if(null == variable)liên tục ...
Holger

1
@ Holder, việc giao nhiệm vụ ngẫu nhiên có gì đáng lo ngại? Đây là Java. Bạn sẽ gặp lỗi loại.
Louis Wasserman

1
@LouisWasserman Không nếu variablelà một Boolean.
Alexis C.

2
@AlexisC, đó sẽ là một mối quan tâm trong một , tiny tiny số trường hợp: biến của bạn có phải là một loại rất cụ thể, bạn phải thực hiện một typo rất cụ thể, bạn không thể sử dụng bất kỳ IDE hoặc trình biên dịch phân tích điều đó sẽ chỉ ra điều đó cho bạn (như hầu hết tất cả các IDE). Tôi khá thoải mái khi không lo lắng về trường hợp đó.
Louis Wasserman

1
Tại nơi làm việc, tôi đã thấy nhiều trường hợp của đối tượng null == . Khi tôi hỏi, tôi được cho biết rằng đó là để ngăn chặn các nhiệm vụ vô tình. Dựa trên các nhận xét và câu trả lời được cung cấp ở đây, tôi sẽ có xu hướng tin rằng đó là một trường cũ của hương vị.
Lucas T

Câu trả lời:


79

nên sử dụng object == null trên Objects.isNull () trong câu lệnh if?

Nếu bạn nhìn vào mã nguồn của IsNullphương pháp,

 /* Returns true if the provided reference is null otherwise returns false.*/

 public static boolean isNull(Object obj) {
     return obj == null;
 }

Nó giống nhau. Không có sự khác biệt. Vì vậy, bạn có thể sử dụng nó một cách an toàn.


14
Có, nó có thể được sử dụng, nhưng nó có thể cản trở việc phân tích luồng cục bộ được thực hiện bởi một công cụ. Tức là, với một dấu "==" đơn giản, bất kỳ phân tích luồng nào cũng có thể thấy rằng sự bỏ qua không tốt trong nhánh then, nhưng an toàn trong một nhánh khác. Bạn sẽ nhận được các lỗi / cảnh báo thích hợp hoặc không có gì. Với việc gọi isNull (), kiến ​​thức có thể bị mất vào tay công cụ.
Stephan Herrmann

3
Có một sự khác biệt hiệu suất nhỏ. Java kiểm tra tham chiếu rỗng đối tượng so với việc gọi một phương thức tĩnh sẽ có sự khác biệt. Và nó đọc hơi kém rõ ràng hơn so với việc chỉ sử dụng == mà tất cả chúng ta đã quen.
Kevin M

3
Là sử dụng ngữ nghĩa hơn == nulltrong if, nhưng IsNull là tuyệt vời để sử dụng trên các biểu thức lambda.
Leonardo Ramos Duarte

1
nó chắc chắn là hợp pháp, nhưng không có bất kỳ lợi ích nào đối với các nhà khai thác. Vì vậy, nếu bạn làm việc theo nhóm, hãy sử dụng mọi thứ theo đúng mục đích của họ.
Alex Panchenko

74

Objects.isNull được thiết kế để sử dụng trong bộ lọc lambda của Java 8.

Viết dễ dàng và rõ ràng hơn nhiều:

.stream().filter(Objects::isNull) 

hơn là viết:

.stream().filter(x -> x == null).  

ifTuy nhiên, trong một tuyên bố, một trong hai sẽ hoạt động. Việc sử dụng == nullcó lẽ dễ đọc hơn nhưng cuối cùng thì nó sẽ chuyển thành tùy chọn phong cách.


12

Nhìn vào nguồn:

public static boolean isNull(Object obj) {
    return obj == null;
}

Để kiểm tra các nullgiá trị, bạn có thể sử dụng:

  • Objects.isNull(myObject)
  • null == myObject // avoids assigning by typo
  • myObject == null // risk of typo

Thực tế Objects.isNulllà cho Predicates không ngăn cản bạn sử dụng nó như trên.


1
Bạn có nghĩa là gì về nguy cơ đánh máy?
Ashish Lohia

2
@AshishLohia bằng cách sử dụng =thay vì ==(sẽ không biên dịch trừ khi đó là một nullable Booleanwrapper, yo công bằng)
Mena

5
Rủi ro về lỗi đánh máy là vấn đề trong C ++ không phải trong Java nếu (myObject = null) sẽ dẫn đến lỗi biên dịch. Bạn nên luôn sử dụng myObject == null trên null == myObject.
Tomas Marik

1
@TomasMarik như đã đề cập trong nhận xét của tôi, rủi ro lỗi đánh máy được giới hạn Booleanở các trình bao bọc có thể vô hiệu trong Java. Điều này thực sự khá hiếm (và sẽ đưa ra cảnh báo trình biên dịch khi một nhiệm vụ nullđược kiểm tra như thể nó là một điều kiện), nhưng không phải là không thể.
Mena

7

Có lý do / tình huống nào mà tôi nên sử dụng object == null trên Objects.isNull () trong câu lệnh if không?

Có, một lý do là để giữ cho mã đơn giản. Trong if tuyên bố object == null rõ ràng và nổi tiếng. Nó không thể dẫn đến bất kỳ hành vi sai trái nào nếu ví dụ như có lỗi đánh máy.

Sự hiểu biết của tôi là Objects.isNull () sẽ loại bỏ cơ hội vô tình gán giá trị null cho đối tượng bằng cách bỏ qua dấu = thứ hai.

Nếu có một if (object = null) {}với bỏ qua, = nó sẽ không biên dịch hoặc nó sẽ tạo ra cảnh báo trong trường hợp Booleanđối tượng! Trên thực tế không có lý do để sử dụng Objects.isNull(object)trên object == nulltrong câu lệnh if . Đây là hai biến thể cạnh nhau:

if (object == null) {
}

if (Objects.isNull(object)) {
}

Objects.isNull () có nên được giới hạn dành riêng cho Predicates không?

Có thể nói là có, nó chỉ giới hạn trong Predicates, mặc dù không có trở ngại kỹ thuật nào để sử dụng Objects.isNull()ở mọi nơi.

Từ public static boolean isNull(Object obj)javadoc của phương thức:

@apiNote Phương thức này tồn tại để được sử dụng như một java.util. Chức năng.Predicate, bộ lọc (Objects :: isNull)

Vì vậy, nếu bạn sử dụng phương thức không phải là một vị từ, bạn thực sự đang sử dụng một biểu thức phức tạp và rườm rà hơn so với biểu thức đơn giản object == null.

Đây là một đoạn mã để so sánh lợi ích của Objects.isNull(object)

List<String> list = Arrays.asList("a", "b", null, "c", null);

// As ready-made predicate
long countNullsWithPredicate = list.stream().filter(Objects::isNull).count();

// Lambda
long countNullsWithLambda = list.stream().filter(object -> object == null).count();

// Reimplement the Objects::isNull predicate
long countNullsWithAnonymous = list.stream().filter(new Predicate<Object>() {
    @Override
    public boolean test(Object obj) {
        return obj == null;
    }
}).count();

1

Về mặt ngữ nghĩa thì không có sự khác biệt nhưng để dễ đọc, tôi thích những thứ sau hơn whatever == null:

import static java.util.Objects.isNull;

// Other stuff...

if(isNull(whatever)) { 

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.