我知道私有实例变量是通过公共getter和setter方法访问的。
但是当我在IDE的帮助下生成构造函数时,它会直接初始化实例变量,而不是通过setter方法初始化它们。
Q1。因此,我应该为构造函数更改IDE生成的代码,以通过其setter方法初始化这些实例变量。
Q2。如果是,那么IDE为什么不以这种方式生成构造函数代码?
============================= EDITED ================= ======================
我使用Eclipse和Netbeans IDE
这是一个普遍的问题。但正如@Lords所要求的,答案取决于我们的构造函数是公开的还是受保护的,还是私有的还是私有的?
答案 0 :(得分:12)
你应该从不从构造函数中调用非final方法。类构造函数用于初始化对象,并且在构造函数返回之前,对象不处于一致状态。如果你的构造函数调用一个后来被子类覆盖的非final方法,你可能会得到奇怪的,意外的结果,因为在调用重写方法时对象没有完全初始化。
考虑这个人为的例子:
class A {
private int x;
public A() {
setX(2);
}
public void setX(int x) {
this.x = x;
}
public int getX() {
return x;
}
}
class B extends A {
private int number = 10;
@Override
public void setX(int x) {
// set x to the value of number: 10
super.setX(number);
}
}
public class Test {
public static void main(String[] args) {
B b = new B();
// b.getX() should be 10, right?
System.out.println("B.getX() = " + b.getX());
}
}
该程序的输出是:
B.getX() = 0
原因是B
的{{1}}成员在调用number
时未初始化,因此使用其默认值setX
。
This article有更全面的解释, Effective Java 也是如此。
答案 1 :(得分:2)
构造函数用于初始化。直接在构造函数中初始化私有实例变量。方法定义对象的行为。在实例化/初始化之后发生行为。使用setter方法处理实例变量的状态。这是经典的OOP思考,也可能是您的IDE生成代码的原因。
答案 2 :(得分:1)
这取决于。如果您的setter / getters只是访问成员,您应该直接访问它们。如果你还有一些代码,请使用setter。
答案 3 :(得分:0)
您应该决定使用构造函数初始化哪些字段以及使用setter初始化哪些字段。 (两者都有可能)我更喜欢尽可能多地使用构造函数,而且通常没有setter。
这应该可以在IDE中配置/选择。在不了解您的IDE的情况下,无法知道它为何如此工作。
答案 4 :(得分:0)
好的答案。只想添加Eclipse(我经常使用的)有模板,您可以修改模板以便按照您想要的方式生成代码。它可以帮助您根据需要调整代码。
PS。我更喜欢使用setter和getter。作为一种习惯,保持代码连贯,如果我把习惯放在代码上,我觉得对别人来说会更容易阅读。
答案 5 :(得分:0)
首先initialization != setters
(至少不总是)
但IDE只是在曾经受到尊重的JavaBean设计模式中表现得很好 假设房产变更应该通过设置者进行。
所以,这是一个设计问题。如果您的类代表纯值对象,那么通过=
进行初始化不会有任何损害
但是,如果您的课程有可能成为JavaBean
,其属性更改不仅仅是初始化或分配,请使用set*
来电。
答案 6 :(得分:0)
类的私有实例变量应该(我相信需要)在任何类构造函数之外声明。如果我可以将你的部分问题分成两部分:
Q1)如果在实例化类时初始化实例变量,与局部变量不同,为什么还要在给定的类构造函数(?)中做额外的工作。
A1)虽然您不需要初始化实例变量(私有字符串someString;默认为null并且是合法的),但这样做的一个原因是编译器分配的默认值可能不是您想要的值,或者更糟,不正确(编译器应该捕获)。
Q2)假设上面的部分,get的意义是什么;组;特性
A2)除了它们容易且更优雅的事实,方法等效,属性可以在你的类中的任何时候使用(显然),它们可以用作简单的赋值或包含额外的代码(有人已经说明了这个验证信息),最后数据自包含在类中,因此更容易调试。
所有这一切,你可能有一个完全正确的理由,做一些不同于书或其他人所说的事情。总是接受“规则”,你应该相应地编码。