'setter'(set-methods)有什么用?

时间:2014-02-24 11:43:06

标签: code-analysis setter getter-setter

也许我选择网站时犯了错误。

抱歉我的英文

直到最近,我认为写settersgetters对于一个只设置一次字段的类没有意义。而不是setters\getters我使用public constant字段(或Java中的final)而是通过构造函数设置字段。

但是我最近遇到了这种方法被证明非常不舒服的情况。类有很多字段(5-7个字段)。

我首先意识到getters的好处。

而不是这样做:

class Human {
    public final int id;
    public final String firstName;
    public final String lastName;
    public final int age;
    public final double money;
    public final Gender gender;
    public final List<Human> children;

    Human(int id, String firstName, String lastName, int age, double money, Gender gender, List<Human> children) {
    // set fields here
    }
}


class HumanReader {
    Human read(Input input) {
        int id = readId(input);
        String firstName = readFirstName(input);
        // ...
        List<Human> children = readChildren(input);
        return new Human(id, firstName, lastName, age, money, gender, children);
    }
}

我开始使用下一个解决方案:

interface Human {
    int getId();
    String firstName;
    // ...
    List<Human> getChildren();
}

class HumanImpl implements Human {
    public int id;
    public String firstName;
    // ...
    public List<Human> children;

    public int getId() {
        return id;
    }

    public String getFirstName() {
        return firstName;
    }

    // ...

    public List<Human> getChildren() {
        return children;
    }
}


class HumanReader {

    Human read(Input input) {
        HumanImpl human = new HumanImpl();
        human.id = readId(input);
        human.firstName = readFirstName(input);
        // ...
        human.children = readChildren(input);
        return human;
    }
}

我认为第二种解决方案更好。它没有复杂的构造函数,参数顺序混乱。

setters有什么用?我还是无法理解。或者他们需要统一性?

2 个答案:

答案 0 :(得分:0)

在这里非常快速的解释,想一想每次更改(设置)属性时需要更改其他内容(可能是UI或数据)的情况。然后,最简单的实现方法是在setter中进行。

这里列出了您可能想要使用它的原因,

Why use getters and setters?

答案 1 :(得分:0)

使用setter和getter的目的是封装对这些值的访问。因此,如果 您的基础数据结构发生了变化,您不必更改其余的代码。想象一下,例如你的Human类突然依赖于数据库...

虽然吸气剂和制定者提供了一个防止变化的小保护,但它们仍然反映了下面的数据结构,所以你仍然可能遇到麻烦。最好的解决方案是尽量避免使用getter和setter,而是提供该类客户端实际需要的服务。 (即,在人类的情况下,考虑让人类能够将自己呈现给界面)