16

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

4

3 回答 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 回答