我刚刚阅读了 SUN java代码约定;非常好的文件btw。我读过这个
6.3 初始化: 尝试初始化声明它们的局部变量。没有初始化的唯一原因 它声明的变量是初始值是否取决于首先发生的某些计算。
我想知道Class variables
是否有同样的建议,例如我有:
public class NNmatrix {
protected ArrayList<ArrayList<Double>> matrix; // line 1
public NNmatrix() {
matrix = new ArrayList<ArrayList<Double>>(); // line 2
}
/**
*
* @param otherMtrx
*/
public NNmatrix(final ArrayList<ArrayList<Double>> otherMtrx) {
final int rows = otherMtrx.size();
matrix = new ArrayList<ArrayList<Double>>(rows); // line3
for (int i = 0; i < rows; i++) {
this.matrix.add(new ArrayList<Double>(otherMtrx.get(i)));
}
}
}
编辑代码#如果我要初始化宣布它的variable
(在课堂上),我会删除“第2行”和离开“第3行“因为你知道性能问题#在内存中保留(行)。
问题是:
答案 0 :(得分:4)
这些是实例变量,而不是类变量。实例变量属于特定对象,类变量不属于(抱歉)。
我认为初始化声明的变量更简单,更容易阅读。
jvm开始在文件顶部初始化实例变量和实例初始化程序块并向下运行,只有在它初始化了所有变量并运行初始化程序块之后才执行构造函数。
答案 1 :(得分:1)
您引用的行仅指局部变量。因为在Java中,局部变量不需要在作用域的顶部声明,但可以在使用之前在任何地方声明,这很有意义。
对于类和实例变量,我个人的偏好是初始化声明它的变量。在许多情况下,我没有任何其他构造函数而不是默认构造函数,因此无需编写默认构造函数,因为编译器将自动提供一个。我发现这会清理并缩短我的代码。
在你提供的第二种情况构造函数中,你可以在构造函数中初步化。
对于类变量,我发现很少次我想在实例化块中初始化而不是在声明中内联。
答案 2 :(得分:1)
我会争辩让你的代码保持原样。
虽然一般来说我喜欢在声明中初始化实例变量,但是当我必须在某些构造函数中重新初始化它时,我不喜欢这样做。我更喜欢在声明中初始化,或者在每个构造函数路径中初始化(可能只是在每个其他构造函数调用的单个构造函数中)。纯声明表示更复杂的事情正在发生,而将最简单的初始化移动到声明可以隐藏它。
答案 3 :(得分:0)
您有几个不同的选项可能都属于微优化。通常,除非您在并发环境中使用静态变量或者像池化类那样做一些时髦的事情,否则这些类型的优化几乎不会引起关注。
没有理由不能在构造函数或类似于概述here的其他方法中初始化变量。就个人而言,我更愿意尽可能在声明中初始化我的变量。
根据我的理解,如果在构造函数和声明中发生,初始化将在大致相同的时间发生。我从来不需要知道实际上哪个实际上是第一个,但你可以做一个简单的System.out测试来找出答案。