有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用Java定义公共库接口的库

在Java中定义库的公共接口有哪些选项

例如,我经常发现事物是公共的,因为库中的另一个包需要它们(尽管仍然有一个公共的基本包,例如com.stackoverflow.mylib),所以他们不能有包访问级别,一般来说,人们不想要庞大的软件包(使用Spring的人似乎也坚持使用单独的控制器/服务/模型/impl/等软件包,这导致一个“功能”被迫跨越多个软件包,而一个给定的服务可能是完全内部的实现细节,不供外部使用……)

因此,理想的目标是让我提供给第三方的Jar清楚地表明,这些东西是不可使用的,理想的方法是完全不提供它们(API Jar中不存在),这样它们就不可能使用这些内部对象/方法并进行编译

更理想的情况是,对象应该只从某种工厂(例如,提供的Springbean)获得,这是一种防止从其代码或自定义Bean直接实例化的方法(这可能会在升级后留下一些未来尚未初始化的属性)

我目前知道的两种正式方式是:

  • 在我参与的一些项目中,有一个api包(例如com.stackoverflow.mylib.api),规则是只有这个包的内容可以被外部用户直接访问
  • 在我参与的其他一些项目中,有一些自定义属性,例如@PublicSDK,用于标记供公众使用的对象和方法(我认为还有一些额外的东西可以确保在公开发布的javadoc和api jar中只标记这样的东西)

共 (1) 个答案

  1. # 1 楼答案

    首先要问自己-你真的需要隐藏实现细节吗

    我之所以这么说,是因为这样做会产生费用,这取决于你的情况,可能值得,也可能不值得

    例如,如果你的API正在被你的直接团队之外的开发人员使用,那么这可能是值得的;然而,如果只是为了在你的团队中隐藏实现细节,我认为这太过分了

    如果API是在项目中使用的,那么一个仅依赖抽象类型或接口的标准就足够了(而且已经是标准了)

    然而,假设您确实需要隐藏实现并只公开公共API,我知道最好的方法是生成两个JAR——一个包含公共API,另一个是该API的实现

    如果使用Maven或Gradle构建使用API的项目,只需在API jar(工件)上声明编译时依赖项,在实现jar(工件)上声明运行时依赖项

    这种模式可以在常见的JavaAPI中看到,最新的例子是JSON API,它作为Glassfish的一部分单独实现