Уменьшить видимость при реализации интерфейса в Java - PullRequest
8 голосов
/ 05 июля 2011

Я хотел бы спроектировать класс A, реализующий интерфейс C и уменьшить видимость метода (объявленного в C), чтобы сделать его защищенным от внешнего мира, сделать один из методов в интерфейсе, реализованном в классе A, закрытым (уменьшить видимость в класс А). Я должен сделать это по соображениям безопасности, как я могу это сделать, есть ли обходной путь. Мы знаем, что по умолчанию в интерфейсе есть открытые члены. Но у меня нет выбора, может кто-нибудь мне помочь. Заранее спасибо.

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

Ответы [ 4 ]

14 голосов
/ 05 июля 2011

Нет, вы не можете уменьшить видимость метода в интерфейсе.Что бы вы ожидали, если бы кто-то написал:

C foo = new A();
foo.methodDeclaredPrivateInA();

?Что касается компилятора, то все, что имеет отношение к реализации C, имеет право вызывать любые методы внутри него - вот в чем суть принципа подстановки Лискова.

Если вы не хотитечтобы реализовать весь открытый интерфейс, не реализуйте его или не создавайте исключения, если это абсолютно необходимо.

Стоит также отметить, что доступность, предоставляемая в исходном коде, редко является хорошей безопасностью мера.Если ваш класс работает на виртуальной машине, которая, в свою очередь, определяет свои собственные права доступа, любой может сделать членов видимыми с помощью отражения.

2 голосов
/ 05 июля 2011

Вы не можете уменьшить видимость метода интерфейса в Java. Является ли приемлемым для вас реализовать метод, бросая java.lang.UnsupportedOperationException?

0 голосов
/ 29 июля 2017

Этот подход работал для меня.Любая новая функция, добавленная в PrivateInterface, сломала бы, все еще сломала PublicSampleClass

private interface PrivateInterface {
    void fooBar();
}

public class PublicSampleClass {

    private final listenerInterface = new PrivateInterface {
         public void fooBar() {
            PublicSampleClass.this.fooBar();
         }
    };

    protected void fooBar() {
      // Non public implementation
    }

}
0 голосов
/ 05 июля 2011

Вы не можете уменьшить видимость, потому что вы могли бы написать что-то вроде

C newC = new A();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...