Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

การใช้งาน requires clause ใน module-info.java ของ Java 9

Module เป็น concept สำคัญใน Java 9 ใช้แบ่งโค้ดเป็น components ย่อยเรียกว่า modules แต่ละ module มีหน้าที่ตัวเองและประกาศ dependency บน modules อื่น เพื่อทำงานได้ถูกต้อง ต้องมีไฟล์ module-info.java ที่ root source code

ประเภทของ requires clause

1) requires <module> - Basic Dependency

โดย default module ไม่รู้จัก modules อื่นใน module-path จึงต้องเพิ่ม requires ทุกครั้งที่ต้องการเข้าถึง module อื่น

module com.tutorialspoint.gui {
    requires com.tutorialspoint.model;
    requires java.desktop;
}

2) requires transitive <module> - Transitive Dependency

กรณี module com.tutorialspoint.model return exported interface types ของ module com.core module ที่ต้องการใช้ model ก็ต้อง requires com.core ด้วย Java 9 ให้ keyword transitive เพื่อบอกว่า dependency นี้ส่งต่อได้ ผู้ใช้ com.tutorialspoint.model เข้าถึง com.core ได้โดยไม่ต้อง requires เอง

module com.tutorialspoint.model {
    requires transitive com.core;
}

3) requires static <module> - Optional Dependency (Compile-time only)

requires static แทน optional dependency:

  • Mandatory at compile time: compile error ถ้า module ไม่อยู่ใน module path ตอน compile
  • Optional at runtime: ไม่ถูกนับใน sanity check ตอน start app เริ่มได้แม้ module หายไป

ตัวอย่าง: รองรับ database หลายตัว (Oracle หรือ H2)

module com.tutorialspoint.model {
    requires static ojdbc;
    requires static h2database.h2;
}

ตารางเปรียบเทียบ

Clause Compile-time Runtime Transitive Use Case
requires Required Required No Normal dependency
requires transitive Required Required Yes API dependency ที่ต้องเผยต่อผู้ใช้
requires static Required Optional No Optional implementation (SPI, drivers)

คำสั่งตรวจสอบ

# ดู requires ของ module
jdeps --module-path mods --module com.tutorialspoint.app

# ใน JShell
jshell> ModuleLayer.boot().findModule("com.tutorialspoint.app").get().getDescriptor().requires()

Best Practices

  • ใช้ requires transitive สำหรับ API dependencies ที่ public types เปิดเผย
  • ใช้ requires static สำหรับ service providers, database drivers, logging implementations
  • หลีกเลี่ยง cyclic dependencies
  • ประกาศ requires เรียงตาม alphabet เพื่ออ่านง่าย