在像类这样的数据结构中公开成员?

时间:2010-01-02 12:30:03

标签: java oop

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

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页)中阅读了与我的问题相关的部分:

  

杂交

     

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

     

这种混合动力车很难添加新的   功能,但也很难添加   新的数据结构。他们是   两个世界中最糟糕的。避免创造   他们。它们表明混乱   作者不确定的设计 -   或者更糟,不知道 - 不管他们是谁   需要保护功能或   类型。

3 个答案:

答案 0 :(得分:2)

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

修改 我的意思是:

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

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

答案 1 :(得分:1)

我无法提出具体建议,因为这取决于你将如何使用该课程。然而...

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

与可访问的,可变数据成员相关的风险在最终时不存在;所有你失去的是能够有意义地继承类的能力。此外,您无法将功能附加到数据访问。但对于轻量级数据传输对象,无​​论如何你都不可能这样做。

答案 2 :(得分:1)

你说:

  

目前我不知道   对它有用的场景   有一个访问成员的方法。

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

考虑到这一点,以及测试MVC的视图组件的麻烦,我总是会实现getter / setter机制。