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

2022-09-03 07:25:38

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


答案 1

顶级接口不能是私有的。它只能具有或包访问权限。来自 Java 语言规范的第 9.1.1 节:“接口修饰符”public

受保护的访问修饰符和私有访问修饰符仅适用于其声明由类声明直接括起来的成员接口 (§8.5.1)。

只要嵌套接口及其子类(如果有)是其顶级类的实现详细信息,就可以嵌套接口。private

例如,下面的嵌套接口用作顶级类的实现详细信息。它纯粹用于定义 JNA 的 API,由接口的 .CLibraryClass

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,该 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 { ... }

    ...
 }

答案 2

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

但是,我经常有两个接口,一个供公共使用,一个供内部使用。如果可能的话,内部使用接口使软件包本地化,例如

public interface MyInterface {
   public void publicMethod();
}

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

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