我们有一个共享实用程序项目,两个独立的SDK项目(每个都指实用程序)和一些插件项目,每个项目只使用其中一个SDK。Shared Utilities包含一些全静态类,这些类需要对上面提到的插件可见,但我们希望对它们隐藏它的其余类。
我们如何着手解决这个问题?我们希望构建过程尽可能简单(我们使用Ant进行构建),并尽可能减少依赖性。
以下是我们迄今为止考虑的选项,以及我们放弃每种方法的原因:
- 第二个共享实用程序项目将提供给插件,这将使部署更加困难
- 从Shared Utils项目中构建两个独立的.jar,一个只包含所有静态实用程序,另一个则包含需要隐藏的内容。这将使构建更加复杂,即对插件的构建脚本有额外的依赖性
- 代理每个SDK中的所有静态类——重复的方法定义,但实现只是从Shared项目中调用相应的静态方法——似乎最简单,缺点是我们需要手动复制Javadoc。有没有一个简单的Javadoc标记,它会在生成时自动执行此操作
- 将所有静态类转换为"普通"类,只需在每个SDK中创建子类——这是不必要的(在我看来)性能开销
"通过代理类公开静态方法"我已经阅读了你的完整问题,我不确定你的问题到底是什么。通过代理(实例)公开静态(与实例无关)方法。
你不想隐瞒什么。你想暴露的是什么。
public class A {
private A(){} //prevent instanciation
public static void doSomething(){} //want to expose to some class, hide from other
}
为了限制doSomething的公开,您可以设置可见性:控制对类成员的访问。
您还可以删除静态特性,并使用静态工厂模式返回对象,如:
public class A {
private A(){}
public void doSomething(){} //want to expose to some class, hide from other
//the new A can also be set in a member variable and
//return always the same instance, if it is unmuttable it will be thread safe.
public static A getInstance(){ return new A();}
}
这看起来可能是"相同的事情",但现在可以通过只控制getInstance()的可见性来控制A中所有方法的可见性,javadoc停留在A上,现在可以控制如何访问getInstance。。。我必须确切地了解你想做什么。