Наилучшая практика в отношении частного arraylist и других подобных конструкций

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

Пример класса:

public class Email
{
 private ArrayList<string> To;
 private ArrayList<string> Cc;
 private ArrayList<string> Bcc;
 ...
}
</string></string></string>

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

3 ответа

Собственно, в этом случае я думаю, что лучше не предоставлять прямую комбинацию getter/setter.

Я бы скорее подошел к нему следующим образом:

  • Измените тип на List (лучше всего использовать интерфейсы на полях.)
  • Инициализировать пустой конструктор ArrayList в конструкторе.
  • Предоставить делегаты для add, remove, hasTo/Cc/Bcc.

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

public void addTo(String recipient){
 // validate recipient
 this.to.add(recipient);
}
public String removeTo(String recipient){
 return this.to.remove(recipient);
}
public boolean hasTo(){
 return this.to.size() > 0;
}

ИЗМЕНИТЬ

Я забыл упомянуть, что геттер имеет смысл, так как вам это нужно, когда обрабатываете электронную почту. Но посмотрите на другой ответ на вопрос о возврате неизменяемого List.


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

Я не согласен. Только разоблачайте то, что вам нужно! Попытайтесь думать в терминах ADT (абстрактные типы данных). Другими словами, создайте слой абстракции из внутреннего ArrayLists. Любой, кто использует ваш класс, не должен знать, что вы внутренне используете ArrayLists. Если это абсолютно необходимо, вы не должны предоставлять геттер для своего ArrayLists. Если вам кажется, что вам это нужно, подумайте о возврате List и используя Collections.unmodifiableList(), чтобы предотвратить модификацию через getter.


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

Это неверно.

Соответствующая рекомендация "наилучшей практики" НЕ должна раскрывать состояния классов как поля.

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

  • Является ли состояние, когда я подвергаю детализации внутренней реализации ADT или ссылку на отдельный объект данных?

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

Хорошо реализованные получатели и сеттеры могут решать эти проблемы; например путем возврата копий коллекций или немодифицируемых оберток и/или путем копирования аргументов коллекции. Но методы-обёртки могут делать то же самое, часто с меньшими затратами времени выполнения.

Еще одна вещь, которую следует учитывать, - есть ли императивы производительности, которые делают необходимым избегать принципов "лучшей практики" и преднамеренно делают ADT "негерметичным".

licensed under cc by-sa 3.0 with attribution.