由于Java中的接口具有默认公共的方法和常量,因此对于我来说,默认(或没有)访问说明符的界面有点矛盾,如下面的情况所示,尽管界面中的方法应该是默认情况下是公共的,但界面在其定义的包之外的包中甚至不可见。
package com.anirudh.package1;
interface IAccessSpecifierInterfaceTest {
/**
*
* @param input
*/
void implementMe(String input);
}
package com.anirudh.package2;
public class TryingToImplementDefaultInterfaceFromOtherPackage implements IAccessSpecifierInterfaceTest {
}
TryingToImplementDefaultInterfaceFromOtherPackage发出错误(无法解析IAccessSpecifierTest
有没有人知道任何保证默认访问界面的实际场景?为什么?
答案 0 :(得分:2)
只要接口是程序包实现的一部分,而不是其公共API的一部分,接口就可以受到程序包保护。
虽然methods和fields是隐式公开的,但是阻止整个界面访问仍然很有价值。
例如,假设您有一个解析并执行自定义脚本语言的包。解析是包的内部。抽象语法树中的所有节点都实现了一个公共接口。但是该接口不是包的公共API的一部分。它可以受到包保护,以防止它在包外使用。
答案 1 :(得分:2)
与任何其他原因一样,为什么要保留东西"包装保护"。
假设您有一个方法调用另一个方法,该方法带有一个参数,指定在几种情况下应该做什么(最基本的例子:onSuccess
和onError
)。您很可能在使用接口的java中实现它。
但是,这是为了您个人和内部使用。您不希望向外暴露此接口。没有人使用您的软件包已经(或应该)访问了相关方法,因此他们没有真正的理由可以访问此接口。
解释场景的简短代码示例:
class DoingSomething {
void doSomething(IResponse response) {
if (/*do something*/) {
response.onSuccess();
} else {
response.onError();
}
}
}
class AskForSomething {
void ask() {
new DoingSomething().doSomething(new IResponse() {
void onSuccess() {
System.out.println("Success.");
}
void onError() {
System.err.println("error..");
}
});
}
}
interface IResponse {
void onSuccess();
void onError();
}
在这种情况下,DoingSomething
和AskForSomething
受包保护,因此IResponse
也应该受到包保护,因为包外没有人可以访问接口或课程/方法。
答案 2 :(得分:0)
与包范围的接口确实有它们的好处,但首先你必须想象,在哪种情况下使用包范围是有意义的。我唯一能想到的是包特定的实现,可以或不应该在包外使用。如果你可以接受这种推理,你肯定会得出结论,所有设计模式都适用于这种情况,因此与包范围的接口确实有意义。
现在唯一要问的是,接口是什么?简而言之,他们根据实现该接口的类的期望来定义合同。由于合同是公开的,即您希望方法及其签名可用,因此默认只能是公开的。