如何将Java API的内部结构隐藏到世界其他地方

Cof*_*nky 14 java api design-patterns

我正在开发一个Java Api来做事情(秘密,呃嗯;).

有没有办法隐藏类,以及我的API的内部结构?

我到现在才发现:

  • 使用内部类(丑陋的方式,我不想把所有内容放在类文件中)
  • 一个包中的所有类,以便我可以使用"包"-visibilty(也很难看,我需要更多的包)

例:

---
package net.my.app;
//this is the Public Access
class MyPublicClass{
    public void somePublicFunction(){ 
        //access to not visibil classes
    }
}

---
package net.my.app.notvisible:
//this is what i want to hide
class MyNOTPublicClass{
    ...
}
---
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?谢谢!

Jef*_*rod 9

您的问题有两种解决方案,不涉及将所有类保留在同一个包中.

第一种是使用(Practical API Design,Tulach 2008)中描述的Friend Accessor/Friend Package模式.

第二是使用OSGi.

相关问题:1,2,3,和4.


Sea*_*oyd 5

  • 使用接口来定义您的应用程序的功能
  • 创建访问服务的主入口点,仅返回接口
  • 我不会为实际隐藏实现类而烦恼。您永远无法在 Java 中真正隐藏它们,那些对技术感兴趣的人可能只是使用调试器启动您的应用程序。例如,只需不提供公共构造函数

对于这条评论:

肖恩,你能详细说明一下你的答案吗?...

实现我的第二个要点的一种方法是使用服务查找类,例如

public class Lookup {
    private static final Foo foo = new FooImpl();
    public static Foo getFoo() { 
        return foo; 
    }
}
Run Code Online (Sandbox Code Playgroud)

Foo是一个接口,FooImpl一个实现类(如果你想强制它不能被客户端实例化,它可以是包私有的)