【问题标题】:Should I provide a setter for a list object in Java?我应该为 Java 中的列表对象提供一个设置器吗?
【发布时间】:2017-09-18 04:59:23
【问题描述】:

我有一个带有这样的列表对象的类:

import java.util.ArrayList;
import java.util.List;

public class MyClass
{
    private List<String> myList;

    //???
}

现在,要让其他类访问该列表,我必须添加以下内容之一:

  • getter 和 setter

  • 一个getter和一个setter,并在构造函数中用一个空的ArrayList初始化列表

  • 一个 getter 和一个 setter,并使用传递给构造函数参数的列表初始化构造函数中的列表

  • 具有两个构造函数的 getter 和 setter

  • 只是一个getter,并在构造函数中用一个空的ArrayList初始化列表

  • 只是一个 getter 并在构造函数中使用传递给构造函数参数的列表初始化列表

  • 只有两个构造函数的getter

最好的做法是什么?有约定吗?

编辑:我所说的“让其他类访问列表”并不是什么具体的意思,只是一般用法,让其他类使用列表,在其中存储和读取对象。

【问题讨论】:

  • 最好的做法取决于需要,而您“让其他类访问列表”的需要并不清楚。请更具体。

标签: java oop object constructor


【解决方案1】:

没有一种方法或约定可以允许将一个类中的 List 字段“提供”给另一个类。

我所说的“让其他类访问列表”并不是什么具体的意思, 只是一般用法,让其他类使用列表,存储 并读取其中的对象。

您可以通过两种方式将有关列表字段的信息从一个类提供给另一个类:

  • 以受保护的方式。这两个类的设计不是非常耦合,而且您希望保护添加到列表中的数据不受包含列表的类的影响。
    因此,您不必为 List 提供 getter 和 setter,而是可以提供公共方法来读取和添加 List 中的数据。
    通过这种方式,客户端类不会与使用的类的实现耦合:它不知道使用了一个 List 以及 List 的唯一负责人(添加/获取/移动,......操作和规则适用于它们) 是它的所有者。
    访问列表的另一种方法是为列表提供一个 getter,但将其提供为不可修改的:

    public List<YourClass> getReadonlyList(){ return Collections.unmodifiableList(originalList); }

  • 以耦合方式。这两个类被设计成非常耦合。因此,为 List 提供 getter 和 setter 并不是问题。它甚至可能非常合适,因为它避免了引入无用的复杂性。

【讨论】:

    【解决方案2】:

    数据隐藏和封装永远是个好原则

    如果没有特定的架构,这有点难以决定,许多工具可以忍受,但如果没有这个架构,很多工具就会死掉......

    您可以对使用我们的类的开发人员温和,并允许他们使用 setter 并提供您列表中那些不可修改的集合。

    这将取决于软件开发人员在创建 MyClass 实例后需要处理多少列表。

    【讨论】:

    • 也许太快了..你的回答看起来像一个详细的评论,但无论如何都很好:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 2010-12-23
    相关资源
    最近更新 更多