You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java项目包结构设计:如何让主类独享其他类访问权限?

实现CoffeePlace专属访问,隔离worker与machine类

方案一:用Java模块系统(Java 9+)

这是最规范的解法,能精准控制跨包访问权限:

  1. 定义模块规则
    在项目根目录创建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;
}
  1. 保持分层包结构
src/main/java
├── module-info.java
└── com
    └── coffeeplace
        ├── CoffeePlace.java
        ├── worker
        │   └── BaristaWorker.java
        └── machine
            └── IceCreamMachine.java
  1. 设置类与方法权限
    worker和machine包内的类、方法都设为public,但通过模块的exports ... to规则,只有CoffeePlace所在的包能访问它们。worker和machine包之间完全无法互相访问对方的类,实现完美隔离。

方案二:静态内部类(适配Java 8及以下)

如果项目基于Java 8,直接把worker和machine类做成CoffeePlace的静态内部类即可:

  1. 调整类结构
    在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();
        // 正常调用业务方法
    }
}
  1. 隔离效果
    这些静态内部类默认仅对CoffeePlace可见,外部类无法访问,worker与machine类之间更不可能互相调用。唯一局限是如果类数量过多,会导致CoffeePlace代码臃肿,适合类数量较少的场景。

方案三:同包拆分+接口隐藏(折中方案)

把worker和machine的实现类藏在内部包,通过接口暴露给CoffeePlace:

  1. 包结构设计
com.coffeeplace
├── CoffeePlace.java
├── Worker.java       // 暴露给CoffeePlace的接口
├── Machine.java      // 暴露给CoffeePlace的接口
└── impl              // 实现类包,默认权限
    ├── BaristaWorkerImpl.java
    └── IceCreamMachineImpl.java
  1. 权限配置
  • Worker和Machine接口设为public,供CoffeePlace调用。
  • impl包内的实现类使用默认权限(不添加修饰符),仅同包的CoffeePlace能访问。
  • CoffeePlace通过接口获取实例:
    Worker barista = new BaristaWorkerImpl();
    Machine machine = new IceCreamMachineImpl();
    
  1. 隔离效果
    impl包内的实现类彼此可访问,如果需要完全隔离,可进一步拆分为impl.worker和impl.machine子包,但这种方式需要CoffeePlace做中转,不如模块系统直接高效。

内容的提问来源于stack exchange,提问作者user20958695

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 10:48:29