Решения о дизайне: зачем и когда делать интерфейс конфиденциальным?

Являются ли частные интерфейсы когда-либо используемыми в дизайнерских решениях? Если да, то каковы причины и когда вы знаете необходимость в частном интерфейсе?

Ответ 1

A интерфейс верхнего уровня не может быть закрытым. Он может иметь только public или доступ к пакету. Из Спецификация языка Java, раздел 9.1.1: "Модификаторы интерфейса" :

Модификаторы доступа, защищенные и закрытые, относятся только к интерфейсам-членам, чьи объявления напрямую заключаются в объявлении класса (§8.5.1).

A вложенный интерфейс может быть private, если он и его подклассы, если они есть, являются деталями реализации своего класса верхнего уровня.

Например, вложенный интерфейс CLibrary ниже используется как деталь реализации класса верхнего уровня. Он использовался исключительно для определения API для JNA, переданного интерфейсом 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 { ... }

    ...
 }

Ответ 2

IMHO Вы не можете с пользой сделать интерфейс конфиденциальным.

Однако у меня часто есть два интерфейса: один для общего пользования и один для внутреннего использования. Внутренний интерфейс использования Я делаю локальный пакет, если это возможно, например.

public interface MyInterface {
   public void publicMethod();
}

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

Методы внутреннего использования выставляют методы, которые я не хочу использовать другим разработчикам, и/или я хочу легко изменить их. Причина, по которой у меня есть интерфейс, заключается в том, что у меня есть несколько реализаций, которые я хочу использовать внутренне через интерфейс.

Ответ 3

Он должен быть защищен пакетом, если интерфейс используется для внутреннего использования. В общем случае, если интерфейс не имеет никакого интереса за пределами его амбиции, это хорошее решение api design чтобы скрыть его, поскольку там меньше сложности для пользователей интерфейс, а также позволяет вам реорганизовать его более легко, потому что, когда интерфейс является общедоступным, а в API вы теряете свободу, чтобы изменить его.