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

时间:2011-01-01 09:55:17

标签: java interface private design-decisions

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

3 个答案:

答案 0 :(得分:5)

顶级界面不能是私密的。它只能有public或包访问权限。来自Java Language Specification, section 9.1.1: "Interface Modifiers"

  

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

嵌套接口可以是private,只要它及其子类(如果有)是其顶级类的 实现细节 < / strong>即可。

例如,下面的嵌套接口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 { ... }

    ...
 }

答案 1 :(得分:3)

恕我直言您无法将界面设为私有。

但是我经常有两个界面,一个用于公共用途,一个用于内部用途。内部使用接口I尽可能使包本地化。例如

public interface MyInterface {
   public void publicMethod();
}

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

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

答案 2 :(得分:1)

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