这个问题并没有涉及具体的问题,而是一个普遍的问题。在Java中,创建一个类时,其实有两个选择如何能够进入该类的实例变量:如何在Java中设置对象的实例变量?
通过创建一个构造,谁就有参数列表中,将设置的值的实例变量。
通过向设置实例变量的类添加setters(和getters)方法。
所以现在我想知道:哪个选项其实更好呢?我还读到,创建对象时不保留实例变量不是好方法,建议为它们设置一些值也是可取的。真的吗?在这种情况下,我会看到第一个选项是更好的选项。
这个问题并没有涉及具体的问题,而是一个普遍的问题。在Java中,创建一个类时,其实有两个选择如何能够进入该类的实例变量:如何在Java中设置对象的实例变量?
通过创建一个构造,谁就有参数列表中,将设置的值的实例变量。
通过向设置实例变量的类添加setters(和getters)方法。
所以现在我想知道:哪个选项其实更好呢?我还读到,创建对象时不保留实例变量不是好方法,建议为它们设置一些值也是可取的。真的吗?在这种情况下,我会看到第一个选项是更好的选项。
如果您认为它们与对象创建有关,请将它们放入构造函数中。例如创建一个正方形,你需要它的大小,但添加一个颜色不是强制性的东西 所以在这种情况下,长度将在构造函数中设置,颜色将通过setter方法设置。
这一切都取决于软件设计和意图,是否有一个用例创建一个新的对象,而没有所有的参数?一些参数? Getters/Setters和其他内部方法都应该在执行任何工作之前检查输入/数据 - 这可以确保您在前进之前可能做出的任何假设都会被检查。
构造函数的纯面向对象思想是创建一个处于一致状态的实例。构造函数的责任是确保不创建不一致的实例。然后,该实例的每个方法都有责任将实例从一致状态转移到另一个一致状态。
因此,我总是建议强制在必须验证所有输入参数的构造函数中设置实例变量。
如果某些实例变量允许修改,请提供一个setter。为了使思考一致,请在构造函数中使用该设置器!为了防止构造器污染,您至少应该有一个构造函数,该构造函数接受所有您不能提供任何合理的默认值或您不想提供setter的所有必需属性值,因为它们的值在构建后是最终的。
对我来说,使用Constructor
方法:
如果你想反对Ready to Use
。
Setters
对象的进一步更改。
除非在施工后有迫切需要更改值,否则我强烈建议在构造函数中设置字段。原因是只有在构造函数中设置的字段可以被设置为immutable,并且不变性是一件非常好的事情,因为它使得类不可能通过反射或任何其他手段被改变。
最终字段的一个例子:
public class MyClass {
private final int id;
public MyClass(int id) {
this.id = id;
}
当字段是一个setter多变,以锁定类向下的唯一方法是通过任一做检查如
public void setID(int id) {
if(id != -1) {
throw new IllegalStateException("Already set!");
}
this.id = id;
}
或者以某种方式锁定整个对象:
public void lock() {
if(getID() == -1) {
throw new IllegalStateException("Must first setID(i).");
}
isLocked = true;
}
public void setID(int id) {
if(isLocked()) {
throw new IllegalStateException("isLocked() is true.");
}
this.id = id;
}
应该很明显,在c中设置字段onstructor是一个很少复杂。
@MichalB:如果你觉得这个答案对你有帮助,请考虑投票并接受它。谢谢! – aliteralmind
取决于情况?通常,当有多个选项时,没有一种方法最适合所有情况。 –