【问题标题】:Expose members in a data structure like class?在类等数据结构中公开成员?
【发布时间】:2010-01-02 12:30:02
【问题描述】:

为了在基于 Servlet 的应用程序中使用,我编写了一个类来存储视图名称和要呈现的对象。实际上,它更像是一种数据结构,而不是 OOP 意义上的类。我想知道我是否应该公开成员或是否应该使用 getter。

public class Result {

    private final int status;
    private final String view;
    private final Map<String, Object> model = new HashMap<String, Object>();

    public Result(final int status, final String view) {
        this.status = status;
        this.view = view;
    }

    public Result put(final String modelName, final Object modelObject) {
        model.put(modelName, modelObject);
        return this;
    }

}

我应该添加 getStatus()、getView() 和 getModel() 还是应该将成员可见性更改为“public”?目前,我不知道有什么方法可以访问成员。 “结果”是一个不可变的数据结构,访问成员时不需要计算。您会为实现更改的不太可能发生的事件添加 getter 吗?

附录

我在 Robert C. Martins 优秀书籍Clean Code(第 99 页)中阅读了与我的问题相关的部分:

混血儿

这种[关于对象和数据结构]的混淆有时会导致 不幸的混合结构是 半对象半数据结构。 他们有做的功能 重要的事情,他们也有 公共变量或公共 访问器和突变器,对于所有人 意图和目的,使私人 可变公开,诱惑他人 使用这些外部函数 变量程序的方式 将使用数据结构。

这样的混合体很难添加新的 功能,但也难以添加 新的数据结构。他们是 两全其美。避免创建 他们。它们表明混乱 作者不确定的设计 - 或者更糟的是,不知道——他们是否 需要保护功能或 类型。

【问题讨论】:

标签: java oop


【解决方案1】:

对于数据持有者类,是否创建 getter 是个人喜好问题。根据您的描述,您可以公开可见性或将状态和视图打包,但我会添加一个 getter 来按名称检索模型。虽然地图是最终的,但它的内容不是。

编辑 我的意思是这样的:

public Object get(final String modelName) {
    return model.get(modelName);
}

没有理由让模型图可见。 (我会将地图命名为“模型”并使用setModel(name, model)getModel(name) 作为访问器。)

【讨论】:

  • 你的意思是这样的吗? public Map getModel() { return java.util.Collections.unmodifiableMap(model); }
  • +1 我还要指出一个缺点:如果您稍后改变主意并决定创建 getter/setter,您将不得不更改所有客户端。 Java 没有语言内置属性的概念。
  • 之所以暴露地图是因为FreeMarker这样的模板引擎可以直接处理地图。
  • 在这种情况下,返回不可修改的地图是一个好方法。我不会每次都创建一个新的,而是创建一个并保留对它的引用作为 getter 中的属性,null 保留在 put() 中的引用。
【解决方案2】:

我无法提出具体建议,因为这取决于您将如何使用该课程。不过……

我经常创建“轻量级”对象作为数据结构来传输一些不可变的数据。和你一样,我将成员设为public final 并在构造函数中对其进行初始化。

与可访问的可变数据成员相关的风险在它们最终确定时不存在;你失去的只是有意义地对类进行子类化的能力。此外,您不能将功能附加到数据访问。但是对于一个轻量级的数据传输对象,你可能不会这样做。

【讨论】:

    【解决方案3】:

    你说:

    目前我什么都不知道 有用的场景 拥有访问成员的方法。

    这正是我提倡通过 getter 访问数据的原因。目前,您正在使用该对象在模型中存储相应的对象。但是,您的模型将来可能会发生变化,但您可能希望以相同的方式在视图中显示数据。

    鉴于此,以及在测试 MVC 的视图组件时令人头疼的问题,我总是会实现 getter/setter 机制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2018-02-10
      • 2011-10-25
      • 1970-01-01
      • 2013-01-21
      • 1970-01-01
      • 2019-04-15
      相关资源
      最近更新 更多