Абстрактный класс Удерживать поле члена или использовать Getter() конкретной реализации?
Один из принципов ООП, с которым я борюсь, это абстрактные классы и их способность хранить поля-члены (переменные).
Возьмем, к примеру, следующий код (пример 1):
public abstract class AbstractClassConstructor {
List mList;
public AbstractClassConstructor(List list) {
mList = list;
}
public Object getListRow(int row) {
return mList.get(row);
}
}
И, пожалуйста, проверьте этот альтернативный код, который обеспечивает ту же функциональность (пример 2):
public abstract class AbstractClassGetter {
public abstract List getList();
public Object getListRow(int row) {
return getList().get(row);
}
}
Меня интересует, является ли пример 1 или пример 2 более понятным, и я хотел бы следовать стандартам ООП как можно ближе.
В настоящее время я вижу больше связи в примере 1, чем в примере 2, хотя я не вижу много других проблем. Пример 2, однако, является более простым, мне нравится, что конкретная реализация содержит частное поле и AbstractClassGetter
использует метод, чтобы получить его. Это кажется лучше, но я изо всех сил пытаюсь применить правильный принцип ООП, чтобы помочь мне узнать, что лучше с этой точки зрения.
1 ответ
Что касается меня, пример 1 не будет идеальным, если mList
будет использоваться в дочернем классе с mList
Функция, которая специфична для его типа (например, LinkedList или ArrayList). Это потому, что, возможно, его нужно привести к фактическому типу, прежде чем он сможет привыкнуть. В этом случае пример 2 будет лучше.
Если в дочернем классе не требуется функция определенного типа, то пример 1 будет лучше с точки зрения инкапсуляции.
обновленный
Другой подход, где, возможно, можно было бы рассмотреть золотую середину, - это использование Generic.
public abstract class AbstractClassConstructor<T extends List> {
T mList;
public AbstractClassConstructor(T list) {
mList = list;
}
public Object getListRow(int row) {
return mList.get(row);
}
}