我最近开始工作,在爪哇和被引入到野性和疯狂的世界,吸气,并制定者的一切。我讨厌它在第一次,但很快得到使用。过用于它。

我已经花了很多时间,最近想更多关于流的设计。有一件事我想做的就是避免的陷阱的做吸气,并制定者的一切。然而,很多的工作,我要做的就是与实体,主要是数据的容器,我不肯定的是,干将制定者和实际上是不适当的,在这些情况。

这里是一个简单的例如使用公共性质。

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

这是一个简单的例子使用私人的属性和使用吸气,并制定者。

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 领域应该能够被改变。

我感觉像吸气/器的例子更为明确和隐藏的执行情况的细节是什么 namedescription 是。它还将允许验证上设定以后,如果需要的。

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

也许有一些选项,我们尚未考虑。我建议!

有帮助吗?

解决方案

把它简单:

  • 你需要吸气的所有领域,必须从外面。
  • 你需要制定者的所有领域,必须从外面。

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

其他提示

第一个版本(公共属性)不是一个好主意。第二个更好。正如Josh Bloch所说,“赞成不变性”。

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;
    }
}

话虽这么说,吸气者和制定者倾向于过度使用

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

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

理想情况下,如果某个类具有getter和setter,那么它应该具有 all

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

虽然访问器模式有助于隐藏类的实现细节(例如,使用哈希表来存储属性以便在稀疏使用的类上节省内存),但实现起来可能非常冗长(您的示例有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; }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top