Абстрактный класс Удерживать поле члена или использовать 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);
    }
}
Другие вопросы по тегам