Подтвердить что ты не робот

Преимущества интерфейса в Java

Мой вопрос прост: есть ли преимущество использования интерфейсов, если они реализованы одним классом?
Я всегда думал, что интерфейсы хороши только тогда, когда есть несколько реализаций этого интерфейса.

Спасибо.

4b9b3361

Ответ 1

Одним словом: нет. Контракт о том, что интерфейс может быть указан непосредственно в вашем единственном классе.

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

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

Если проект длинный, поскольку, вероятно, он будет подвергнут изменениям, тогда вам придется учитывать:

  • вероятность того, что вам понадобится интерфейс.
  • вероятность того, что вы теперь знаете, какие методы потребуется интерфейсу в будущем.
  • стоимость выполнения интерфейса теперь и рефакторинг в будущем.

Ответ 2

Учтите, что теперь может быть только одна реализация, но в будущем может появиться больше импликаций. Кроме того, с помощью интерфейса вы можете избежать создания зависимости от конкретного класса, используя только интерфейс. Затем, если вы решите изменить реализацию, вы можете создать новую, которая реализует интерфейс без неблагоприятного влияния на другой код, который зависит только от вашего интерфейса.

Рассмотрим:

public interface SomeInterface {...}

public class AConsumerOfSomeInterface {
    private SomeInterface service;

    public AConsumerOfSomeInterface(SomeInterface theImplementation) {
        service = theImplementation;
    }
    //some code which uses the service
}

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

Ответ 3

Интерфейсы - это способ развязки отдельных программных компонентов. Конечно, вы можете использовать базу данных Oracle для хранения всех своих данных сегодня, поэтому почему бы не обойтись без всех ваших интерфейсов DAO?

Ответ заключается в том, что крепкая связь с чем-либо может вернуться и укусить вас в будущем. Что, если в следующем году вы захотите использовать некоторые облачные сервисы для хранения данных? Если вы закодированы на интерфейсе DAO, вы можете просто ввести новую реализацию облака и подключить ее прямо. Ваше приложение слабо связано, поэтому его не нужно изменять.

Ответ 4

Я хотел бы добавить еще один момент: интерфейс помогает в шаблон прокси.

В веб-приложении этот прокси-сервер очень помогает в абстракции. Я новичок в веб-приложении, но обычно я проектирую свой сервисный уровень по интерфейсу. В создании веб-приложения с Wicket У меня, скажем, интерфейс Afrodite и класс AfroditeImpl как сервисный уровень, инициализированный из applicationContext как spring bean. Затем мы можем получить все методы, определенные в Afrodite и реализованные в AfroditeImpl со всех веб-страниц на

AfroditeApplication application = (AfroditeApplication)getApplication();
Afrodite afrodite = application.getAfrodite();
// Now call the service layer methods by afrodite

Контур:

public interface Afrodite {

}

public class AfroditeImpl implements Afrodite {

}

public class AfroditeApplication extends WebApplication {

    Afrodite afrodite;

    public Afrodite getAfrodite() {
        return afrodite;
    }

    @Override
    public void init() {        
        super.init();
        ApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext());        
        afrodite = (Afrodite) applicationContext.getBean("afrodite");
    }
}

Надеюсь, что это поможет.

Ответ 5

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

Вы можете легко добавить интерфейс, если он установлен, иногда несколько интерфейсов.

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

Ответ 6

есть ли какое-либо преимущество использования интерфейсов, если они реализованы один класс?

Если ваш интерфейс реализован только одним классом, и вы на 100% уверены, что никогда не почувствуете необходимость добавления другой реализации, тогда нет никаких преимуществ.

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

public interface clientInterface{
     public foo();
     public bar();
}

public class yourClass implements clientInterface{
     public foo(){}
     public bar(){}

     public doSomethingElse(){}
}

public class clientSideFactory{
     public clientInterface getClass(){
               return new yourClass();
     }
}
public class internalSideFactory{
     public clientClass getClass(){
            return new yourClass();
     }
}
}

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