为什么"默认"访问说明符允许接口?

时间:2015-04-19 15:20:43

标签: java interface

由于Java中的接口具有默认公共的方法和常量,因此对于我来说,默认(或没有)访问说明符的界面有点矛盾,如下面的情况所示,尽管界面中的方法应该是默认情况下是公共的,但界面在其定义的包之外的包中甚至不可见。

package com.anirudh.package1;
interface IAccessSpecifierInterfaceTest {
    /**
     *
     * @param input
     */
    void implementMe(String input);
}

package com.anirudh.package2;

public class TryingToImplementDefaultInterfaceFromOtherPackage implements IAccessSpecifierInterfaceTest {
}

TryingToImplementDefaultInterfaceFromOtherPackage发出错误(无法解析IAccessSpecifierTest

有没有人知道任何保证默认访问界面的实际场景?为什么?

3 个答案:

答案 0 :(得分:2)

只要接口是程序包实现的一部分,而不是其公共API的一部分,接口就可以受到程序包保护。

虽然methodsfields是隐式公开的,但是阻止整个界面访问仍然很有价值。

例如,假设您有一个解析并执行自定义脚本语言的包。解析是包的内部。抽象语法树中的所有节点都实现了一个公共接口。但是该接口不是包的公共API的一部分。它可以受到包保护,以防止它在包外使用。

答案 1 :(得分:2)

与任何其他原因一样,为什么要保留东西"包装保护"。

假设您有一个方法调用另一个方法,该方法带有一个参数,指定在几种情况下应该做什么(最基本的例子:onSuccessonError)。您很可能在使用接口的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();
}

在这种情况下,DoingSomethingAskForSomething受包保护,因此IResponse也应该受到包保护,因为包外没有人可以访问接口或课程/方法。

答案 2 :(得分:0)

与包范围的接口确实有它们的好处,但首先你必须想象,在哪种情况下使用包范围是有意义的。我唯一能想到的是包特定的实现,可以或不应该在包外使用。如果你可以接受这种推理,你肯定会得出结论,所有设计模式都适用于这种情况,因此与包范围的接口确实有意义。

现在唯一要问的是,接口是什么?简而言之,他们根据实现该接口的类的期望来定义合同。由于合同是公开的,即您希望方法及其签名可用,因此默认只能是公开的。