1. บทนำ
คีย์เวิร์ดJava assertช่วยให้นักพัฒนาสามารถตรวจสอบสมมติฐานหรือสถานะของโปรแกรมได้อย่างรวดเร็ว
ในบทความนี้เราจะมาดูวิธีการใช้คีย์เวิร์ดJava assert
2. ประวัติ Java Assertions
คีย์เวิร์ดJava assertถูกนำมาใช้ใน Java 1.4 ดังนั้นจึงมีมาระยะหนึ่งแล้ว อย่างไรก็ตามยังคงเป็นคีย์เวิร์ดที่ไม่ค่อยมีใครรู้จักซึ่งสามารถลดจำนวนสำเร็จรูปลงอย่างมากและทำให้โค้ดของเราอ่านง่ายขึ้น
ตัวอย่างเช่นบ่อยครั้งในโค้ดของเราเราจำเป็นต้องตรวจสอบเงื่อนไขบางอย่างที่อาจทำให้แอปพลิเคชันของเราทำงานไม่ถูกต้อง โดยปกติเราจะเขียนอะไรแบบนี้:
Connection conn = getConnection(); if(conn == null) { throw new RuntimeException("Connection is null"); }
การใช้การยืนยันเราสามารถลบคำสั่งif and throwด้วยคำสั่งassertเพียงครั้งเดียว
3. การเปิดใช้งาน Java Assertions
เนื่องจากการยืนยัน Java ใช้คีย์เวิร์ดยืนยันจึงไม่จำเป็นต้องมีไลบรารีหรือแพ็กเกจในการนำเข้า
โปรดทราบว่าก่อนหน้า Java 1.4 การใช้คำว่า "assert" สำหรับการตั้งชื่อตัวแปรวิธีการและอื่น ๆ อาจทำให้เกิดข้อขัดแย้งในการตั้งชื่อเมื่อใช้โค้ดรุ่นเก่ากับ JVM เวอร์ชันใหม่กว่า
ดังนั้นเพื่อความเข้ากันได้ย้อนหลังJVM ที่ปิดใช้งานการตรวจสอบยืนยันโดยค่าเริ่มต้น ต้องเปิดใช้งานอย่างชัดเจนโดยใช้อาร์กิวเมนต์บรรทัดคำสั่ง-enableassertionsหรือชวเลข-ea:
java -ea com.baeldung.assertion.Assertion
ในตัวอย่างนี้เราได้เปิดใช้งานการยืนยันสำหรับทุกชั้นเรียน
นอกจากนี้เรายังสามารถเปิดใช้การยืนยันสำหรับแพ็กเกจและคลาสเฉพาะ:
java -ea:com.baeldung.assertion... com.baeldung.assertion.Assertion
ที่นี่เราได้เปิดใช้งานการยืนยันสำหรับคลาสทั้งหมดในแพ็คเกจcom.baeldung.assertion
ในทำนองเดียวกันพวกเขาสามารถปิดการใช้งานที่เฉพาะเจาะจงสำหรับแพคเกจและการเรียนโดยใช้-disableassertionsสั่งอาร์กิวเมนต์บรรทัดหรือจดชวเลขของ-da เรายังสามารถใช้อาร์กิวเมนต์ทั้งสี่นี้ร่วมกันได้
4. การใช้ Java Assertions
ในการเพิ่มการยืนยันเพียงใช้คำหลักที่ยืนยันและกำหนดเงื่อนไขบูลีน :
public void setup() { Connection conn = getConnection(); assert conn != null; }
Java ยังจัดเตรียมไวยากรณ์ที่สองสำหรับการยืนยันที่ใช้สตริงซึ่งจะใช้เพื่อสร้างAssertionErrorหากมีการโยน:
public void setup() { Connection conn = getConnection(); assert conn != null : "Connection is null"; }
ในทั้งสองกรณีรหัสกำลังตรวจสอบว่าการเชื่อมต่อกับทรัพยากรภายนอกส่งคืนค่าที่ไม่ใช่ค่าว่าง ถ้าค่าที่เป็นโมฆะ JVM ที่จะโดยอัตโนมัติโยน AssertionError
ในกรณีที่สองข้อยกเว้นจะมีรายละเอียดเพิ่มเติมที่จะปรากฏในการติดตามสแต็กและสามารถช่วยในการดีบักปัญหาได้
มาดูผลลัพธ์ของการเรียกใช้คลาสของเราโดยเปิดใช้งานการยืนยัน:
Exception in thread "main" java.lang.AssertionError: Connection is null at com.baeldung.assertion.Assertion.setup(Assertion.java:15) at com.baeldung.assertion.Assertion.main(Assertion.java:10)
5. การจัดการAssertionError
ชั้นAssertionErrorขยายข้อผิดพลาดที่ตัวเองขยายThrowable ซึ่งหมายความว่าAssertionErrorเป็นข้อยกเว้นที่ไม่ได้ตรวจสอบ
ดังนั้นจึงไม่จำเป็นต้องใช้วิธีการที่ใช้การยืนยันในการประกาศและไม่ควรพยายามเรียกรหัสเพิ่มเติม
AssertionErrorsมีขึ้นเพื่อระบุเงื่อนไขที่ไม่สามารถกู้คืนได้ในแอปพลิเคชันดังนั้นอย่าพยายามจัดการหรือพยายามกู้คืน
6. แนวทางปฏิบัติที่ดีที่สุด
สิ่งที่สำคัญที่สุดที่จะจำเกี่ยวกับการยืนยันคือว่าพวกเขาสามารถใช้งานจึงไม่ถือว่าพวกเขาจะได้รับการดำเนินการ
ดังนั้นควรคำนึงถึงสิ่งต่อไปนี้เมื่อใช้คำยืนยัน:
- ตรวจสอบค่าว่างและตัวเลือกว่างตามความเหมาะสมเสมอ
- หลีกเลี่ยงการใช้การยืนยันเพื่อตรวจสอบอินพุตในวิธีสาธารณะและใช้ข้อยกเว้นที่ไม่ได้ตรวจสอบแทนเช่นIllegalArgumentExceptionหรือNullPointerException
- อย่าเรียกเมธอดในเงื่อนไขการยืนยันและกำหนดผลลัพธ์ของวิธีการให้กับตัวแปรโลคัลแทนและใช้ตัวแปรนั้นกับการยืนยัน
- การยืนยันเป็นสิ่งที่ดีสำหรับสถานที่ในโค้ดที่จะไม่ถูกดำเนินการเช่นกรณีเริ่มต้นของคำสั่งswitchหรือหลังจากวนซ้ำที่ไม่สิ้นสุด
7. สรุป
คีย์เวิร์ดJava assertมีให้บริการมาหลายปีแล้ว แต่ยังคงเป็นคุณลักษณะที่ไม่ค่อยมีใครรู้จัก สามารถช่วยลบโค้ดสำเร็จรูปจำนวนมากทำให้โค้ดอ่านง่ายขึ้นและช่วยระบุจุดบกพร่องในช่วงต้นของการพัฒนาโปรแกรม
เพียงจำไว้ว่าการยืนยันไม่ได้เปิดใช้งานโดยค่าเริ่มต้นดังนั้นอย่าคิดว่าจะถูกดำเนินการเมื่อใช้ในโค้ด
เช่นเคยซอร์สโค้ดแบบเต็มสามารถใช้ได้บน GitHub