2013-12-10 64 views
2

我试图封装服务包的所有内部功能。我的大多数类和方法都是包私有的。我有一些内部接口,我不想在包之外暴露。我可以使接口本身package-private,但所有的方法仍然是公共的(接口方法的默认范围)。什么等同于封装封装内部功能的封装专用接口?

对于在此包中从我的内部实现中消除公共方法签名的选项是什么?

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

一些事情要考虑:使用源代码分析将报告接口的方法为公共的API方法开发工具。例如,一个UML生成器会生成一个令人误解的UML图,这个图不正确地显示这是一个公共方法。

+2

您可以交换抽象类的接口。 – Bart

+0

为什么需要降低界面成员的可视性?如果接口本身是包私有的,如果它的成员是公共的,它又有什么关系?是否有公共类实现这些接口的问题,并且您不希望接口方法实现公开显示? –

+0

请参阅http://stackoverflow.com/questions/423032/interfaces-in-java-cannot-make-implemented-methods-protected-or-private – CupawnTae

回答

1

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

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

想到的最后一项工作是利用一些模式,例如, Double dispatchVisitor可能会有用。

+0

感谢您提到使用抽象类的单一继承问题。 –

+0

移动界面并不会改变实现仍然需要公共签名的事实。 –