java.util.Objects.isNull กับ object == null


91

อย่างที่ทราบjava.util.Objectsคือ

คลาสนี้ประกอบด้วยวิธียูทิลิตี้แบบคงที่สำหรับการดำเนินการกับอ็อบเจ็กต์

Objects.isNull()หนึ่งในวิธีการดังกล่าวเป็น

ความเข้าใจของฉันคือการที่จะเอาโอกาสของการตั้งใจกำหนดค่าโมฆะไปยังวัตถุโดยเลี่ยงที่สองObjects.isNull()=

อย่างไรก็ตาม API Note ระบุว่า:

วิธีนี้มีไว้เพื่อใช้เป็นเพรดิเคตตัวกรอง (Objects :: isNull)

จะมีเหตุผลใด ๆ / สถานการณ์ที่ฉันควรใช้object == nullมากกว่าObjects.isNull()ในถ้ามีคำสั่ง ?

ควรObjects.isNull()จำกัด เฉพาะ Predicates เท่านั้นหรือไม่?


4
หากสิ่งที่คุณกังวลคือการมอบหมายงานโดยไม่ได้ตั้งใจคุณสามารถใช้if(null == variable)อย่างสม่ำเสมอ ...
Holger

1
@ ผู้ปกครองมีงานมอบหมายที่ไม่ได้ตั้งใจอะไรให้กังวล? นี่คือ Java คุณจะได้รับข้อผิดพลาดประเภท
Louis Wasserman

1
@LouisWasserman ไม่ถ้าvariableเป็นBoolean.
Alexis C.

2
@AlexisC นั่นเป็นข้อกังวลในกรณีเล็ก ๆ น้อย ๆ : ตัวแปรของคุณต้องเป็นประเภทที่เฉพาะเจาะจงมากและคุณต้องพิมพ์ผิดที่เฉพาะเจาะจงมากและคุณไม่สามารถใช้ IDE หรือการวิเคราะห์คอมไพเลอร์ใด ๆ นั่นจะชี้ให้คุณเห็น (เช่นเดียวกับ IDE เกือบทั้งหมด) ฉันค่อนข้างสบายใจที่ไม่ต้องกังวลเกี่ยวกับกรณีนั้น
Louis Wasserman

1
ในที่ทำงานฉันได้เห็นอินสแตนซ์ของวัตถุ null ==มากมาย เมื่อฉันสอบถามฉันได้รับแจ้งว่าเป็นการป้องกันการกำหนดค่าว่างโดยไม่ได้ตั้งใจ จากความคิดเห็นและคำตอบที่ให้ไว้ที่นี่ฉันมีแนวโน้มที่จะเชื่อว่ามันเป็นเรื่องของรสนิยม
Lucas T

คำตอบ:


82

ควรใช้ object == null บน Objects.isNull () ในคำสั่ง if?

หากคุณดูซอร์สโค้ดของIsNullวิธีการ

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

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

มันเหมือนกัน. ไม่มีความแตกต่างกัน คุณจึงใช้งานได้อย่างปลอดภัย


14
ใช่สามารถใช้ได้ แต่อาจรบกวนการวิเคราะห์โฟลว์ในเครื่องที่ดำเนินการโดยเครื่องมือ กล่าวคือด้วย "==" แบบธรรมดาการวิเคราะห์โฟลว์ใด ๆ จะเห็นว่าการหักล้างไม่ดีในสาขานั้น แต่ปลอดภัยในสาขาอื่น คุณจะได้รับข้อผิดพลาด / คำเตือนที่เหมาะสมหรือไม่มีอะไรเลย ด้วยทิศทางของการเรียก isNull () ความรู้อาจสูญหายไปกับเครื่องมือ
Stephan Herrmann

3
มีประสิทธิภาพแตกต่างกันเล็กน้อย การตรวจสอบ Java สำหรับการอ้างอิงอ็อบเจ็กต์ null เทียบกับการเรียกใช้วิธีการแบบคงที่จะมีความแตกต่าง และมันอ่านน้อยกว่าอย่างชัดเจนเล็กน้อยเมื่อใช้ == ที่เราทุกคนคุ้นเคย
Kevin M

3
ใช้== nullในเชิงความหมายมากกว่าifแต่ isNull เหมาะอย่างยิ่งที่จะใช้กับนิพจน์แลมบ์ดา
Leonardo Ramos Duarte

1
มันถูกต้องตามกฎหมายอย่างแน่นอน แต่ไม่มีผลประโยชน์ใด ๆ เหนือตัวดำเนินการ ดังนั้นหากคุณทำงานเป็นทีมโปรดใช้สิ่งต่างๆตามวัตถุประสงค์ที่ตั้งใจไว้
Alex Panchenko

78

Objects.isNull มีไว้สำหรับใช้ภายในการกรองแลมด้า Java 8

เขียนง่ายและชัดเจนกว่ามาก:

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

กว่าจะเขียน:

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

อย่างไรก็ตามภายในifแถลงการณ์จะใช้ได้ผล การใช้งาน== nullอาจอ่านง่ายกว่า แต่ในที่สุดมันก็จะเดือดตามสไตล์ที่ต้องการ


12

ดูที่มา:

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

ในการตรวจสอบnullค่าคุณสามารถใช้:

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

ความจริงที่Objects.isNullมีไว้สำหรับPredicates ไม่ได้ป้องกันไม่ให้คุณใช้ตามข้างต้น


1
ความเสี่ยงของการพิมพ์ผิดหมายถึงอะไร?
Ashish Lohia

2
@AshishLohia โดยใช้=แทน==(จะไม่รวบรวมเว้นแต่จะเป็นBooleanกระดาษห่อหุ้มที่เป็นโมฆะคุณจะยุติธรรม)
Mena

5
ความเสี่ยงของการพิมพ์ผิดเป็นปัญหาใน C ++ ไม่ใช่ใน Java หาก (myObject = null) จะทำให้เกิดข้อผิดพลาดในการคอมไพล์ คุณควรใช้ myObject == null เหนือ null == myObject เสมอ
Tomas Marik

1
@TomasMarik ตามที่กล่าวไว้ในความคิดเห็นของฉันความเสี่ยงของการพิมพ์ผิดถูก จำกัด ไว้ที่Booleanเครื่องห่อที่เป็นโมฆะใน Java สิ่งนี้ค่อนข้างหายากจริงๆ (และจะให้คำเตือนคอมไพเลอร์เมื่อมีการnullตรวจสอบการมอบหมายให้ราวกับว่าเป็นเงื่อนไข) แต่ก็ไม่เป็นไปไม่ได้
Mena

7

จะมีเหตุผล / สถานการณ์ใดบ้างที่ฉันควรใช้ object == null ทับ Objects.isNull () ในคำสั่ง if ?

ใช่เหตุผลหนึ่งคือเพื่อให้รหัสง่าย คำสั่ง ภายในถ้าobject == nullชัดเจนและเป็นที่รู้จักกันดี ไม่สามารถนำไปสู่พฤติกรรมที่ไม่เหมาะสมใด ๆ เช่นมีการพิมพ์ผิด

ความเข้าใจของฉันคือ Objects.isNull () จะลบโอกาสในการกำหนดค่าว่างให้กับวัตถุโดยไม่ได้ตั้งใจโดยการละเว้น = ที่สอง

หากมีการif (object = null) {}มีการละเว้น =มันจะไม่รวบรวมหรือมันจะสร้างคำเตือนในกรณีของBooleanวัตถุ! ที่จริงมีเหตุผลที่จะใช้ไม่มีObjects.isNull(object)มากกว่าobject == nullภายในถ้ามีคำสั่ง นี่คือสองรูปแบบเคียงข้างกัน:

if (object == null) {
}

if (Objects.isNull(object)) {
}

Objects.isNull () ควร จำกัด เฉพาะ Predicates หรือไม่?

อาจกล่าวได้ว่าใช่มัน จำกัด เฉพาะ Predicates เท่านั้นแม้ว่าจะไม่มีอุปสรรคทางเทคนิคในการใช้ไฟล์ Objects.isNull()ทุกที่

จากpublic static boolean isNull(Object obj)javadoc ของวิธีการ:

วิธีนี้มีอยู่เพื่อใช้เป็น java.util.function.Predicate, filter (Objects :: isNull)

ดังนั้นหากคุณใช้วิธีนี้ไม่ใช่เพรดิเคตคุณกำลังใช้นิพจน์ที่ซับซ้อนและยุ่งยากกว่าเมื่อเทียบกับแบบง่ายobject == nullมูลฐานคุณเป็นจริงโดยใช้ความซับซ้อนมากขึ้นและการแสดงออกยุ่งยากเมื่อเทียบกับที่เรียบง่าย

นี่คือตัวอย่างเพื่อเปรียบเทียบประโยชน์ของ 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();

2

ความหมายไม่มีความแตกต่าง แต่เพื่อความสามารถในการอ่านฉันชอบสิ่งต่อไปนี้มากกว่าwhatever == null:

import static java.util.Objects.isNull;

// Other stuff...

if(isNull(whatever)) { 

}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.