设计决策:为什么以及何时将接口设为私有?

私有接口是否曾用于设计决策? 如果是这样,原因是什么,何时知道需要私有接口?

顶级界面不能是私密的。 它只能有public或包访问权限。 从Java语言规范,第9.1.1节:“接口修饰符” :

访问修饰符protected和private仅适用于其声明直接由类声明(第8.5.1节)包围的成员接口。

只要嵌套接口及其子类(如果有)是其顶级类实现细节,它就可以是private 接口

例如,下面的嵌套接口CLibrary用作顶级类的实现细节。 它纯粹用于定义JNA的API,由接口的Class传递。

 public class ProcessController { private interface CLibrary extends Library { CLibrary INSTANCE = (CLibrary) Native.loadLibrary( "c", CLibrary.class ); int getpid(); } public static int getPid() { return CLibrary.INSTANCE.getpid(); } } 

作为另一个示例,此私有接口定义由实现自定义格式符号的私有嵌套类使用的API。

 public class FooFormatter { private interface IFormatPart { /** Formats a part of Foo, or text. * @param foo Non-null foo object, which may be used as input. */ void write( Foo foo ) throws IOException; } private class FormatSymbol implements IFormatPart { ... } private class FormatText implements IFormatPart { ... } ... } 

恕我直言你不能有用地使接口私密。

但是我经常有两个接口,一个用于公共用途,另一个用于内部使用。 内部使用接口如果可能,我将包本地化为例如

 public interface MyInterface { public void publicMethod(); } interface DirectMyInterface extends MyInterface { public void internalUseOnlyMethod(); } 

内部使用方法暴露了我不希望其他开发人员使用和/或我希望能够轻松更改的方法。 我有接口的原因是我有几个我希望通过接口在内部使用的实现。

如果接口用于内部使用,则必须受到包保护。 一般来说,如果界面没有任何兴趣,那么它是一个很好的api设计决定来隐藏它,因为界面用户的复杂性较低,并且允许你更容易地重构它,因为当界面是公共的并且在API你失去了改变它的自由。