实体对象数据属性的getter和setter

时间:2009-01-02 08:24:58

标签: entity anti-patterns setter getter

我最近开始在Java工作,并被介绍到疯狂和疯狂的吸气剂和制定者的世界。我起初讨厌它,但很快就习惯了。太习惯了。

我最近花了很多时间思考课堂设计。我要做的其中一件事就是避免为所有事情做吸气剂和制定者的陷阱。但是,我所做的大部分工作都是使用主要是数据容器的实体,我不确定在这些情况下,getter和setter实际上是不合适的。

以下是使用公共属性的简单示例。

class Space {
    public String name;
    public String description;
    Space(final String name, final String description) {
        this.name = name;
        this.description = description;
    }
}

这是一个使用私有属性并使用getter和setter的简单示例。

class Space {
    private String name;
    private String description;
    Space(final String name, final String description) {
        this.name = name;
        this.description = description;
    }
    public String getName() {
        return this.name;
    }
    public void setName(final String name) {
        this.name = name;
    }
    public String getDescription() {
        return this.description;
    }
    public void setDescription(final String description) {
        this.description = description;
    }
}

在这些示例中,namedescription字段都应该可以更改。

我觉得getter / setter示例更清晰,并且隐藏了namedescription的实现细节。如果需要,它还允许稍后进行验证。

我已经阅读了几个关于吸气剂和制定者是邪恶的和/或反模式的讨论,但它真的感觉那些可能不适用于这种情况。

也许我还有一些选择尚未考虑过。我愿意接受建议!

4 个答案:

答案 0 :(得分:6)

第一个版本(公共属性)不是一个好主意。第二个更好。正如Josh Bloch所说,"favor immutability"

public class Space {
    private final String name;
    private final String description;

    public Space(final String name, final String description) {
        this.name = name;
        this.description = description;
    }

    public String getName() {
        return name;
    }

    public String getDescription() {
        return description;
    }
}

话虽如此,getters and setters tend to be overused

答案 1 :(得分:4)

你听说经常过于简单的“获取/制定者是邪恶的”。没人(我希望)真的意味着它对数据对象有任何不妥之处。我认为真正的想法是:

“Getters / Setters是邪恶的,除了普通的数据存储对象”,它本身只是“告诉不要问”的传福音。

理想情况下,如果一个类有getter和setter,那么 all 就应该有。

无论如何,这就是争论。我不确定我同意它。

答案 2 :(得分:3)

说实话:

  • 您需要从外部读取所有字段的getter。
  • 您需要为所有必须从外部书写的字段设置。

这可能是100%,但大部分时间都是较少。

答案 3 :(得分:0)

虽然访问器模式有助于隐藏类的实现细节(例如,使用哈希表来存储属性以便在稀疏使用的类上节省内存),但实现起来可能非常冗长(您的示例有12行更多的访问器)。这就是为什么C#有一个特殊的属性语法,它允许简明地指定默认访问器:

class Space {
    public String Name { get; set; }
    public String Description { get; set; }
    Space(final String name, final String description) {
        this.Name = name;
        this.Description = description;
    }
}

替代表单可能会添加访问说明符和/或代码:

private String _name;
public String Name {
    get { if (_name == null) FetchName(); return _name; }
    private set { _name = value; }
}