java - 我应该将方法 "add"添加到包含列表的类中吗?

标签 java class oop

我的代码中有这个类:

public class Schedule{
    private List<ScheduleData> list;

    public Schedule(){
        list = new ArrayList<>();
    }

    public List<ScheduleData> getList(){
        return list;
    }

    public void add(ScheduleData data){
        list.add(data);
    }
}

这个类将有一些方法来操作这个 ScheduleData 列表并将其数据与其他一些东西进行比较。

我的问题是: 将 ScheduleData 元素添加到我的列表中的更好做法是什么?使用此方法 public void add(ScheduleData data) 还是像下面的代码那样做?

Schedule s = new Schedule();
s.getList().add(new ScheduleData());

最佳答案

我认为最初你必须尝试满足面向对象的基本原则。其中之一是信息隐藏

引用 Wikipedia :

In computer science, information hiding is the principle of segregation, of the design decisions in a computer program that are most likely to change, thus protecting other parts of the program from extensive modification if the design decision is changed. The protection involves providing a stable interface which protects the remainder of the program from the implementation (the details that are most likely to change).

很可能,Schedule 类的客户不需要知道内部是如何实现一个调度的。您不希望您的客户受限于您选择在内部存储 ScheduleData 的实现。想一想,如果您让您的客户直接访问 list,一旦您想使用 Set 更改实现,您将强制他们相应地更改。

此外,遵循信息隐藏原则,您将减少类和客户端之间的耦合,从而提高可维护性。

因此,根据您提供给我们的信息,您能做的最好的事情可能是使用直接在 Schedule 上定义的方法 add

我建议你改变的另一件事是方法

public List<ScheduleData> getList(){
    return list;
}

返回对内部列表的直接引用,您将允许任何人在不使用 add 方法的情况下更改它。相反,请尝试返回列表的不可修改副本。

public List<ScheduleData> getList(){
    return Collections.unmodifiableList(list);
}

希望对您有所帮助。

关于java - 我应该将方法 "add"添加到包含列表的类中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43683402/

相关文章:

java - Spring Sentry 集成。事件处理器不工作(阻止健康检查)

python使用内部类动态创建类

java - 如何从android中的普通类调用main_activity的方法

javascript - 在 es6 中调用另一个类的函数

c# - 传递3种不同数据类型来做同一件事的方法?

oop - 参数与成员变量

java - 如何在jframe中找到滑动方向

java - 通过索引访问 Java 数组位置的值

java - 有没有更好的方法可以一次向集合中添加多个单词?

java - 我们可以使用扩展代替实现来使用接口(interface)吗