облегчая изменение реализации интерфейса позже - PullRequest
0 голосов
/ 04 января 2012

Таким образом, в java способ инициализации интерфейса, такого как коллекция или список, заключается в создании экземпляра класса, который его реализует, например:

Collection<Object> moo = new ArrayList();

Если я хотел указать реализациюпозже в моем коде я думал об этом, создав еще один класс, например:

class ListList extends ArrayList{

}

, а затем инициализировал переменную с помощью

Collection<Object> moo = new ListList();

И затем все, что требуется, еслиПозже я хочу изменить реализацию, чтобы изменить то, что расширяет ListList.

Итак, вот вопрос ... есть ли лучший способ сделать это (я все еще чувствую, как будто я неопытен с этим типомвещь).

Ответы [ 3 ]

6 голосов
/ 04 января 2012

есть ли лучший способ сделать это

Да: используйте фабричный метод:

public static Collection<Object> createCollection() {
    return new ArrayList<Object>(); // change this later, if need be
}

Затем вызывайте фабрику, а не создавайте ее:

Collection<Object> moo = createCollection();

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

0 голосов
/ 04 января 2012

Основная идея хорошая. Сделайте вашу переменную / field / ... экземпляром интерфейса, а не конкретного класса, который вы используете. Это заставит весь ваш код работать с интерфейсом (при условии, что вы не начнете приводить куда-нибудь вниз по пути кода) и позволит позже заменить реализацию другим классом, если вы чувствуете необходимость в этом.

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

0 голосов
/ 04 января 2012

Вы также можете сделать это таким образом

Collection<Object> coll=new ArrayList(){
        //bla
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...