Java项目包结构设计:如何让主类独享其他类访问权限?
实现CoffeePlace专属访问,隔离worker与machine类
方案一:用Java模块系统(Java 9+)
这是最规范的解法,能精准控制跨包访问权限:
- 定义模块规则
在项目根目录创建module-info.java,明确模块的访问控制逻辑:
module coffee.place { // 仅允许CoffeePlace所在包访问worker和machine包 exports com.coffeeplace.worker to com.coffeeplace; exports com.coffeeplace.machine to com.coffeeplace; // 若主类需要对外暴露则添加此行,无需暴露可省略 exports com.coffeeplace; }
- 保持分层包结构
src/main/java ├── module-info.java └── com └── coffeeplace ├── CoffeePlace.java ├── worker │ └── BaristaWorker.java └── machine └── IceCreamMachine.java
- 设置类与方法权限
worker和machine包内的类、方法都设为public,但通过模块的exports ... to规则,只有CoffeePlace所在的包能访问它们。worker和machine包之间完全无法互相访问对方的类,实现完美隔离。
方案二:静态内部类(适配Java 8及以下)
如果项目基于Java 8,直接把worker和machine类做成CoffeePlace的静态内部类即可:
- 调整类结构
在CoffeePlace.java中编写静态内部类:
public class CoffeePlace { // BaristaWorker仅CoffeePlace可访问 static class BaristaWorker { void makeCoffee() { // 业务逻辑实现 } } // IceCreamMachine仅CoffeePlace可访问 static class IceCreamMachine { void makeIceCream() { // 业务逻辑实现 } } public static void main(String[] args) { BaristaWorker barista = new BaristaWorker(); IceCreamMachine machine = new IceCreamMachine(); // 正常调用业务方法 } }
- 隔离效果
这些静态内部类默认仅对CoffeePlace可见,外部类无法访问,worker与machine类之间更不可能互相调用。唯一局限是如果类数量过多,会导致CoffeePlace代码臃肿,适合类数量较少的场景。
方案三:同包拆分+接口隐藏(折中方案)
把worker和machine的实现类藏在内部包,通过接口暴露给CoffeePlace:
- 包结构设计
com.coffeeplace ├── CoffeePlace.java ├── Worker.java // 暴露给CoffeePlace的接口 ├── Machine.java // 暴露给CoffeePlace的接口 └── impl // 实现类包,默认权限 ├── BaristaWorkerImpl.java └── IceCreamMachineImpl.java
- 权限配置
Worker和Machine接口设为public,供CoffeePlace调用。impl包内的实现类使用默认权限(不添加修饰符),仅同包的CoffeePlace能访问。- CoffeePlace通过接口获取实例:
Worker barista = new BaristaWorkerImpl(); Machine machine = new IceCreamMachineImpl();
- 隔离效果
impl包内的实现类彼此可访问,如果需要完全隔离,可进一步拆分为impl.worker和impl.machine子包,但这种方式需要CoffeePlace做中转,不如模块系统直接高效。
内容的提问来源于stack exchange,提问作者user20958695
相关产品推荐
相关产品推荐

