有哪些选项可以定义Java库的公共接口?
例如,我经常发现某些内容是公共的,因为库中的另一个包需要它们(尽管仍然具有共同的基本包,例如com.stackoverflow.mylib),所以它们不能具有包访问级别,通常人们不想要大型包(似乎使用Spring的人坚持使用单独的控制器/服务/模型/impl等包,导致一个“功能”被强制跨越许多包,而给定的服务可能是完全的内部实现细节,不适用于外部使用...)。
因此,理想的目标是使我提供给第三方的Jar清楚地表明这些内容不应该被使用,最好根本不提供它们(在API jar中不存在),这样他们就无法使用和编译那些内部对象/方法。
更理想的情况是,只有从某种工厂(例如提供的Spring Bean)获得对象的方式,才能防止直接从其代码或自定义bean进行实例化(可能会在升级后留下一些未初始化的属性)。
我目前知道的两种正式方式是:
在一些我参与的项目中,有一个api包(例如com.stackoverflow.mylib.api),规则是只有该包的内容可以被外部用户直接访问。
在我参与的其他一些项目中,有一些自定义属性,例如@PublicSDK,用于标记供公众使用的对象和方法(我认为还需要一些额外的内容来确保只有被标记为这样的内容才包含在公开分发的javadoc和api jar中)。
例如,我经常发现某些内容是公共的,因为库中的另一个包需要它们(尽管仍然具有共同的基本包,例如com.stackoverflow.mylib),所以它们不能具有包访问级别,通常人们不想要大型包(似乎使用Spring的人坚持使用单独的控制器/服务/模型/impl等包,导致一个“功能”被强制跨越许多包,而给定的服务可能是完全的内部实现细节,不适用于外部使用...)。
因此,理想的目标是使我提供给第三方的Jar清楚地表明这些内容不应该被使用,最好根本不提供它们(在API jar中不存在),这样他们就无法使用和编译那些内部对象/方法。
更理想的情况是,只有从某种工厂(例如提供的Spring Bean)获得对象的方式,才能防止直接从其代码或自定义bean进行实例化(可能会在升级后留下一些未初始化的属性)。
我目前知道的两种正式方式是:
在一些我参与的项目中,有一个api包(例如com.stackoverflow.mylib.api),规则是只有该包的内容可以被外部用户直接访问。
在我参与的其他一些项目中,有一些自定义属性,例如@PublicSDK,用于标记供公众使用的对象和方法(我认为还需要一些额外的内容来确保只有被标记为这样的内容才包含在公开分发的javadoc和api jar中)。