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)