【问题标题】:Abstract Class Hold Member Field or Use Getter() of Concrete Implementation?抽象类持有成员字段还是使用具体实现的getter()?
【发布时间】:2016-09-02 15:32:34
【问题描述】:

我正在努力解决的一个 OOP 原则是抽象类及其保存成员字段(变量)的能力。

以下面的代码为例(示例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);
    }
}

我关心的是example 1还是example 2更易于维护,我也想尽可能地遵循OOP标准。

目前我在示例 1 中看到的耦合比在示例 2 中更多,尽管我没有看到很多其他问题。然而,示例 2 更直接,我喜欢具体实现包含私有字段,AbstractClassGetter 使用方法来获取它。这感觉更好,但我正在努力应用正确的 OOP 原则来帮助我从这个角度了解哪个更好。

【问题讨论】:

    标签: java oop variables abstract member


    【解决方案1】:

    就我而言,如果mList 将用于具有特定于其类型的mList 函数(例如LinkedList 或ArrayList)的子类中,则示例1 并不理想.这是因为它可能需要转换为实际类型才能使用。在这种情况下,示例 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);
        }
    }
    

    【讨论】:

    • 谢谢,事实上你是正确的,在子类中使用了mList,是的,子类需要更具体的类型ArrayList。这实际上就是我最终选择示例 2 的原因。所以我想我为这项任务选择了正确的路线。我现在明白两者都有什么用了,谢谢。
    • 听起来不错。我还添加了另一个选项供您考虑。如果答案对您有好处,也许您可​​以勾选答案并投赞成票:)。我喜欢你的问题,给它加星并投票。这让我想起了以前没有想到的原因。
    猜你喜欢
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    相关资源
    最近更新 更多