设计决策中是否曾经使用过私有接口?如果是这样,原因是什么?您何时知道需要私有接口?
问问题
17203 次
3 回答
9
顶级接口不能是私有的。它只能具有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 { ... }
...
}
于 2015-10-28T18:42:33.597 回答
3
恕我直言,您无法有效地将接口设为私有。
但是我经常有两个接口,一个供公共使用,一个供内部使用。如果可能的话,我将包本地化的内部使用接口,例如
public interface MyInterface {
public void publicMethod();
}
interface DirectMyInterface extends MyInterface {
public void internalUseOnlyMethod();
}
内部使用方法公开了我不希望其他开发人员使用和/或我希望能够轻松更改的方法。我拥有接口的原因是我有几个实现,我想通过接口在内部使用它们。
于 2011-01-01T10:05:32.270 回答
1
如果接口供内部使用,则必须对其进行包保护。一般来说,如果接口在其范围之外没有任何兴趣,那么隐藏它是一个很好的 api 设计决策,因为接口用户的复杂性更低,并且还允许您更轻松地重构它,因为当接口是公共的并且在您失去更改它的自由的 API。
于 2011-01-01T10:12:31.850 回答