การใช้ Java Assertions

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