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

标签 entity anti-patterns setter getter

我最近开始使用 Java 工作,并接触到了一切事物的 getter 和 setter 的疯狂世界。一开始我很讨厌它,但很快就习惯了。太习惯了。

我最近花了很多时间更多地思考类设计。我想做的一件事是避免陷入为所有事情都进行 getter 和 setter 的陷阱。然而,我所做的大部分工作都是针对主要是数据容器的实体,我不确定 getter 和 setter 在这些情况下实际上是否合适。

这是一个使用公共(public)属性的简单示例。

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

这是一个使用私有(private)属性以及使用 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 的实现细节。如果需要的话,它还允许稍后在现场进行验证。

我读过一些关于 getter 和 setter 是邪恶的和/或反模式的讨论,但感觉这些可能不适用于这种情况。

也许有些选项我还没有考虑过。我愿意接受建议!

最佳答案

第一个版本(公共(public)属性)不是一个好主意。第二个更好。正如乔什·布洛赫(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 .

关于实体对象数据属性的 getter 和 setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/406288/

相关文章:

java - POJO 中没有 getter 方法不会通过 setter 方法设置值

java - SQL查询: incorrect work with entity

ios - 了解在 Core Data 中添加/更新关系对象

php - 具有 varchar id 的 Doctrine2 实体不将 id 插入数据库

design-patterns - 这种反模式叫什么?

objective-c - UIImage setter NSInvalidArgumentException

java - 插入触发器导致 EntityNotFoundException

asp.net-mvc - 我可以使用 Ninject 将依赖项注入(inject)属性而不是使用服务定位器模式吗?

java - bloated class 和 tagged class 有什么区别?

c++ - 在同一类中强制使用 Getter/Setter (C++)