Java初学者:初始化类变量

5
我刚刚阅读了《SUN Java 代码规范》(非常好的文档),并且我读到了下面的内容:
6.3 初始化:尽量在声明变量时初始化局部变量。如果变量的初始值取决于某些计算先进行,则不初始化该变量是唯一的理由。
我想知道类变量是否有相同的建议,例如我有以下代码:
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)));
        }
    }
}

编辑代码# 如果我在声明变量时初始化它(在类中),我将删除“第2行”并保留“第3行”,因为这会涉及性能问题# 就像您所知道的那样,在内存中保留(行)。

问题是:

  1. 这样做是一个好习惯还是仅适用于方法内部等局部变量的初始化问题?
  2. 如果可以,我想知道如果我进行了EDITING CODE#,则初始化@ line 3或初始化@ line 1将首先出现?
4个回答

4

这些是实例变量,不是类变量。实例变量属于特定的对象,而类变量则不属于任何一个对象(抱歉有点挑剔)。

我认为在声明变量时进行��始化更加简单易读。

JVM从文件顶部开始初始化实例变量和实例初始化块,并向下执行,只有在初始化所有变量并运行初始化块之后才执行构造函数。


1
你引用的那行代码只涉及到局部变量。因为在Java中,局部变量不需要在作用域顶部声明,而是可以在使用之前的任何地方声明,这是很有意义的。
对于类和实例变量,我个人偏好在声明变量的地方初始化变量。在许多情况下,如果没有其他构造函数,这将消除编写默认构造函数的需要,因为编译器会自动提供一个。我发现这样可以清理和缩短我的代码。
在你提供的第二种情况下,你可以充分考虑在构造函数中进行初始化。
对于类变量,我发现很少有时候我想要在实例化块中进行初始化,而不是在声明时内联初始化。

1
我会建议保留你的代码现状。
一般来说,我喜欢在声明时初始化实例变量,但如果我必须在某个构造函数中重新初始化它们时,我不喜欢这样做。我更倾向于在声明时或每个构造函数路径中进行初始化(也许只需在被所有其他构造函数调用的单个构造函数中)。纯声明表明更复杂的情况正在发生,而将最简单的初始化移动到声明中可以隐藏这一点。

0

您有几个不同的选择,这些选择可能都属于微观优化。通常,除非在并发环境中使用静态变量或执行类似池化类等奇怪的操作,否则这些类型的优化通常无关紧要。

  1. 您可以在构造函数或其他类似此处所述方法中初始化变量,这样做没有任何问题。个人而言,我更喜欢在可能的情况下在声明时初始化变量。

  2. 据我了解,如果在构造函数中与在声明时进行初始化,则初始化将在大致相同的时间发生。我从未必须知道实际上哪个先发生,但您可以进行简单的System.out测试以找出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接