也许我选择网站时犯了错误。
抱歉我的英文
直到最近,我认为写setters
和getters
对于一个只设置一次字段的类没有意义。而不是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
有什么用?我还是无法理解。或者他们需要统一性?
答案 0 :(得分:0)
在这里非常快速的解释,想一想每次更改(设置)属性时需要更改其他内容(可能是UI或数据)的情况。然后,最简单的实现方法是在setter中进行。
这里列出了您可能想要使用它的原因,
答案 1 :(得分:0)
使用setter和getter的目的是封装对这些值的访问。因此,如果 您的基础数据结构发生了变化,您不必更改其余的代码。想象一下,例如你的Human类突然依赖于数据库...
虽然吸气剂和制定者提供了一个防止变化的小保护,但它们仍然反映了下面的数据结构,所以你仍然可能遇到麻烦。最好的解决方案是尽量避免使用getter和setter,而是提供该类客户端实际需要的服务。 (即,在人类的情况下,考虑让人类能够将自己呈现给界面)