как скрыть неподдерживаемые методы интерфейса от класса - PullRequest
0 голосов
/ 06 апреля 2019

У меня есть интерфейс:

public interface Service {
    default Type service1(Type t) throws IOException {
        throw new UnsupportedOperationException();
    }

    default Type service2(Type t) throws IOException {
        throw new UnsupportedOperationException();
    }
}

и класс, реализующий этот интерфейс, но требуется только service2:

class MyService implements Service{
    @Override
    Type service2(Type t) throws IOException {
        ...
    }
}

Затем я создаю экземпляр myservice:

Service s = new MyService();
s.service1(t); // throws error at runtime

Есть ли лучший способ скрыть или пометить этот метод service1 (), чтобы указать, что никто не должен использовать этот неподдерживаемый метод в коде (например, с помощью аннотации?).Или я должен создать другой шаблон для таких случаев?

Ответы [ 3 ]

3 голосов
/ 06 апреля 2019

Интерфейс Service (по вашему описанию) является явным нарушением принципа разделения интерфейса ( ISP ).У вас должно быть два интерфейса для Service1 и Service2.Если вам нужна агрегация, вы можете получить ее через интерфейс под названием AggregatedService, который будет расширять Service1 и Service2.

При вашем текущем дизайне невозможно скрыть один метод только от внешней системы.

0 голосов
/ 06 апреля 2019

Реализация наследует все методы от своего реализованного интерфейса.Поэтому, если вы создаете экземпляр этой реализации, вы можете получить доступ ко всем (не частным) методам в этой реализации и реализованном интерфейсе.

0 голосов
/ 06 апреля 2019

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

public interface Service {

    @Deprecated
    default Type service1(Type t) throws IOException {
        throw new UnsupportedOperationException();
    }

    default Type service2(Type t) throws IOException {
        throw new UnsupportedOperationException();
    }
}

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

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