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

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

Module เป็นการรวม code และ data ที่มีชื่อ ประกาศ dependencies บน modules อื่น exports packages ที่มี public types เข้าถึงได้จากภายนอก และระบุ services ที่ใช้หรือ provide ทั้งหมดระบุในไฟล์ module-info.java ที่อยู่ root directory ของ module

มี 2 ประเภทของ export clause ใน module-info.java

1) export <package> - Export แบบ Public

โดย default public types ของ module ไม่มองเห็นจากภายนอก เพื่อให้ public types ของ package ใดๆ มองเห็นจาก modules อื่น ต้อง export package นั้น จดจำว่าเป็นระดับ package ไม่ใช่ระดับ type แต่อย่าเพิ่งว่า sub-packages ไม่ได้ถูก export อัตโนมัติ

module com.tutorialspoint.model {
    exports tp.com.tutorialspoint.model;
}

สำคัญ: Package หนึ่งสามารถอยู่ใน module ได้เพียง module เดียวเท่านั้น ถ้าซ้ำจะได้ error:

Error:(1, 1) java: package exists in another module:

2) export <package> to <module> - Export แบบ Qualified (Limited Access)

สามารถเพิ่มความปลอดภัยโดยจำกัด visibility ของบาง packages ให้เฉพาะ module ที่ระบุเท่านั้น module ที่อยู่ในรายการเท่านั้นที่เข้าถึงคลาสเหล่านี้ได้

module com.tutorialspoint.model {
    exports tp.com.tutorialspoint.model 
        to com.tutorialspoint.gui;
}

ตัวอย่างครบถ้วน

module com.tutorialspoint.app {
    // Public export - ทุก module เข้าถึงได้
    exports com.tutorialspoint.api;
    
    // Qualified exports - เฉพาะ module ที่ระบุ
    exports com.tutorialspoint.internal 
        to com.tutorialspoint.gui, 
           com.tutorialspoint.service;
    
    // ไม่ export com.tutorialspoint.impl - ใช้ภายใน module เท่านั้น
    
    requires com.tutorialspoint.model;
    requires java.desktop;
}

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

# ดู exports ของ module
jdeps --print-module-deps --module-path mods --module com.tutorialspoint.app

# หรือใน JShell
jshell> ModuleLayer.boot().findModule("com.tutorialspoint.app").get().getDescriptor().exports()

Best Practices

  • Export น้อยที่สุดเท่าที่จำเป็น (Principle of least privilege)
  • ใช้ qualified exports สำหรับ internal packages ที่ต้อง share ให้ module เฉพาะบางตัว
  • แยก API packages (export) และ implementation packages (ไม่ export)
  • หลีกเลี่ยง split packages (package เดียวในหลาย modules)