【问题标题】:What is equivalent to a package-private interface for encapsulating internal functionality of a package?什么等同于封装包内部功能的包私有接口?
【发布时间】:2013-12-28 17:02:29
【问题描述】:

我正在尝试封装服务包的所有内部功能。我的大多数类和方法都是包私有的。我有一些我不想在包之外公开的内部接口。我可以将接口本身设为包私有,但所有方法仍然是公共的(接口方法的默认范围)。

我有哪些选择可以从这个包的内部实现中消除公共方法签名?

我正在使用接口,以便我可以使用 spring 轻松切换实现。

需要考虑的一些事项:使用源代码分析的开发工具会将接口方法报告为公共 API 方法。例如,UML 生成器会生成误导性的 UML 图,错误地将其显示为公共方法。

【问题讨论】:

  • 你可以把接口换成抽象类。
  • 为什么要降低界面成员的可见度?如果接口本身是包私有的,那么它的成员是否是公共的又有什么关系呢?问题是您有实现这些接口的公共类,并且您不希望接口方法实现公开可见吗?
  • @MikeStrobel 一个用例可能是一个公共类,它实现了我不想暴露的方法。其他需要考虑的事情是使用源代码检查和报告“公共”方法的各种开发工具,例如列出公共 API 的工具。
  • @Bart 为此使用抽象类有什么缺点吗?你能回答一下吗?

标签: java interface scope encapsulation


【解决方案1】:

正如@Bart 已经指出的那样,一种可能的解决方案是使用抽象类而不是接口。与此概念相关的一个可能问题是单继承问题。

另一种解决方案可能是将“私有”接口分离到不同的包中,该包不需要与您的服务包一起发布,因为这种方法可能会破坏接口的语义,特别是如果一个逻辑接口具有“私有”和“公共”部分。

想到的最后一个解决方法是利用一些模式,例如Double dispatchVisitor 可能很有用。

【讨论】:

  • 感谢提到使用抽象类的单继承问题。
  • 移动接口不会改变实现仍然需要公共签名这一事实。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-15
  • 2014-09-09
  • 2011-05-25
  • 2019-11-01
  • 1970-01-01
  • 2018-05-17
相关资源
最近更新 更多