Дизайнерские решения: зачем и когда делать интерфейс закрытым? - PullRequest
13 голосов
/ 01 января 2011

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

Ответы [ 3 ]

5 голосов
/ 28 октября 2015

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

    ...
 }
3 голосов
/ 01 января 2011

ИМХО Вы не можете сделать интерфейс закрытым.

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

public interface MyInterface {
   public void publicMethod();
}

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

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

1 голос
/ 01 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...