tl; drความคิดเห็นของฉันคือการใช้เอกภาพ+
เพื่อเรียกใช้ unbox ในหนึ่งในตัวถูกดำเนินการเมื่อตรวจสอบความเท่าเทียมกันของค่าและเพียงใช้ตัวดำเนินการทางคณิตศาสตร์เป็นอย่างอื่น เหตุผลดังนี้
มันได้รับการกล่าวมาแล้วว่า==
การเปรียบเทียบInteger
คือการเปรียบเทียบตัวตนซึ่งมักจะไม่ใช่สิ่งที่โปรแกรมเมอร์ต้องการและจุดมุ่งหมายคือการเปรียบเทียบมูลค่า ยังฉันได้ทำวิทยาศาสตร์เล็กน้อยเกี่ยวกับวิธีการเปรียบเทียบที่มีประสิทธิภาพมากที่สุดทั้งในแง่ของความกะทัดรัดโค้ดถูกต้องและความเร็ว
ฉันใช้วิธีการปกติ:
public boolean method1() {
Integer i1 = 7, i2 = 5;
return i1.equals( i2 );
}
public boolean method2() {
Integer i1 = 7, i2 = 5;
return i1.intValue() == i2.intValue();
}
public boolean method3() {
Integer i1 = 7, i2 = 5;
return i1.intValue() == i2;
}
public boolean method4() {
Integer i1 = 7, i2 = 5;
return i1 == +i2;
}
public boolean method5() { // obviously not what we want..
Integer i1 = 7, i2 = 5;
return i1 == i2;
}
และได้รับรหัสนี้หลังจากรวบรวมและ decompilation:
public boolean method1() {
Integer var1 = Integer.valueOf( 7 );
Integer var2 = Integer.valueOf( 5 );
return var1.equals( var2 );
}
public boolean method2() {
Integer var1 = Integer.valueOf( 7 );
Integer var2 = Integer.valueOf( 5 );
if ( var2.intValue() == var1.intValue() ) {
return true;
} else {
return false;
}
}
public boolean method3() {
Integer var1 = Integer.valueOf( 7 );
Integer var2 = Integer.valueOf( 5 );
if ( var2.intValue() == var1.intValue() ) {
return true;
} else {
return false;
}
}
public boolean method4() {
Integer var1 = Integer.valueOf( 7 );
Integer var2 = Integer.valueOf( 5 );
if ( var2.intValue() == var1.intValue() ) {
return true;
} else {
return false;
}
}
public boolean method5() {
Integer var1 = Integer.valueOf( 7 );
Integer var2 = Integer.valueOf( 5 );
if ( var2 == var1 ) {
return true;
} else {
return false;
}
}
อย่างที่คุณเห็นได้อย่างชัดเจนวิธีที่ 1 โทรInteger.equals()
(ชัด) วิธีที่ 2-4 ส่งผลให้เกิดรหัสเดียวกันโดยแกะค่าออก.intValue()
มาแล้วเปรียบเทียบกับพวกเขาโดยตรงและวิธีที่ 5 เป็นการกระตุ้นการเปรียบเทียบตัวตนซึ่งเป็นวิธีที่ไม่ถูกต้อง เปรียบเทียบค่า
ตั้งแต่ (ดังที่ได้กล่าวไปแล้วโดยเช่น JS) equals()
เกิดค่าใช้จ่าย (มันต้องทำinstanceof
และไม่เลือกนักแสดง) วิธี 2-4 จะทำงานด้วยความเร็วเท่ากันอย่างเห็นได้ชัดดีกว่าวิธีที่ 1 เมื่อใช้ในลูปแน่นเนื่องจาก HotSpot ไม่ instanceof
มีแนวโน้มที่จะเพิ่มประสิทธิภาพการปลดเปลื้องและ
มันค่อนข้างคล้ายกับตัวดำเนินการเปรียบเทียบอื่น ๆ (เช่น<
/ >
) - พวกเขาจะทริกเกอร์ unboxing ในขณะที่ใช้compareTo()
จะไม่ - แต่เวลานี้การดำเนินการจะปรับให้เหมาะสมโดย HS เนื่องจากintValue()
เป็นเพียงวิธีการทะเยอทะยาน
ในความคิดของฉันไม่ค่อยใช้รุ่น 4 เป็นวิธีที่รัดกุมที่สุด - นักพัฒนา C / Java ทุกคนรู้ว่า unary plus เป็นกรณีส่วนใหญ่เท่ากับint
/ ถึง.intValue()
- ในขณะที่มันอาจเป็นช่วงเวลาWTFเล็กน้อยสำหรับบางคน ไม่ใช้ unary plus ในช่วงชีวิตของพวกเขา) มันแสดงให้เห็นถึงเจตนาที่ชัดเจนและชัดเจนที่สุด - มันแสดงให้เห็นว่าเราต้องการint
คุณค่าของตัวถูกดำเนินการตัวหนึ่งบังคับให้ค่าอื่น ๆ ไปยัง unbox เช่นกัน นอกจากนี้ยังคล้ายกันมากที่สุดกับการi1 == i2
เปรียบเทียบปกติที่ใช้สำหรับint
ค่าดั้งเดิม
คะแนนของฉันเป็นของi1 == +i2
& i1 > i2
สไตล์สำหรับInteger
วัตถุทั้งเหตุผลด้านประสิทธิภาพและความสอดคล้อง นอกจากนี้ยังทำให้โค้ดพกพาเป็นแบบดั้งเดิมโดยไม่ต้องเปลี่ยนแปลงสิ่งอื่นนอกจากการประกาศประเภท การใช้วิธีการที่ตั้งชื่อดูเหมือนว่าจะแนะนำเสียงความหมายให้ฉันคล้ายกับbigInt.add(10).multiply(-3)
สไตล์ที่ถูกวิพากษ์วิจารณ์มาก