Вопрос о том, как получить и установить и когда использовать супер классы - PullRequest
3 голосов
/ 23 мая 2010

У меня есть следующий метод get:

public List<PersonalMessage> getMessagesList() {
    List<PersonalMessage> newList = new ArrayList<PersonalMessage>();

    for(PersonalMessage pMessage : this.listMessages) {
        newList.add(pMessage.clone());
    }

    return newList;
}

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

Тогда у меня есть этот метод набора:

public void setMessagesList(ArrayList<PersonalMessage> listMessages) {
    this.listMessages = listMessages;
}

У меня вопрос: стоит ли использовать List вместо `ArrayList в сигнатуре метода?

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

Но я не уверен, что это путь ...

Ответы [ 3 ]

7 голосов
/ 23 мая 2010

Метод установки нарушает абстракцию базового представления. Это действительно нужно на вашем общедоступном интерфейсе?

public void setMessagesList(Collection<PersonalMessage> messages) {
    this.listMessages = new ArrayList<PersonalMessage>(messages);
}
2 голосов
/ 23 мая 2010

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

Вы также соглашаетесь с самим собой, если используете Список. Геттер и сеттер имеют одинаковый тип.

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

0 голосов
/ 23 мая 2010

Вы зависите от порядка PersonalMessages, или коллекции также будет достаточно? Почему вы хотите форсировать конкретную реализацию? Для кода выше тип Paramater Collection или даже Iterable будет достаточно.

...