2010-12-07 149 views
5

我刚刚读了SUN java代码约定;很好的文件btw。我读过这java初学者:初始化类变量

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行”,因为性能问题#在内存中保留(行),如你所知。

的问题是:

  1. 是做一个很好的做法或初始化事项只适用于局部变量里面只有方法等?
  2. 如果没关系,我想知道如果我执行了编辑代码#初始化@行3或初始化@行1,哪一个会先到?

回答

4

这些是实例变量,而不是类变量。实例变量属于特定的对象,类变量不(对不起)。

我认为初始化声明的变量更简单易读。

jvm在文件顶部开始初始化实例变量和实例初始化块,并且只有在初始化所有变量并运行初始化块后才会执行构造函数。

+0

是的我现在有了更多的经验后,现在同意你的意见 – 2011-10-06 10:57:28

1

您引用的行仅引用局部变量。因为在Java中局部变量不需要在范围的顶部声明,但可以在使用之前在任何地方声明,这是非常有意义的。

对于类和实例变量,我个人的偏好是初始化它声明的变量。在许多情况下,如果我没有任何其他构造函数而不是默认的构造函数,则不需要编写默认构造函数,因为编译器会自动提供一个构造函数。我发现这样会清理并缩短我的代码。

在第二种情况下,您提供的构造函数可以在构造函数中进行初始化。

有了类变量,我发现有几次我想在实例化块中初始化,而不是在声明中内联。

0

你有几个不同的选项,可能都属于微优化。通常,这些类型的优化是很少关注的,除非您在并发环境中使用静态变量或者像池类那样做一些奇怪的事情。

  1. 有没有理由,你为什么不能在构造函数或类似于概述here其他方法初始化变量。就我个人而言,我更愿意尽可能在声明中初始化我的变量。

  2. 从我的理解,如果发生在构造函数和声明中,初始化将大致同时发生。我从来不需要知道实际上哪个实际上是第一个,但是你可以做一个简单的System.out测试来查明。

1

我会争论让你的代码保持原样。

尽管一般情况下我喜欢在声明中初始化实例变量,但我不喜欢这样做,因为我必须在某个构造函数中重新初始化它们。我更喜欢在声明或每个构造函数路径中初始化(也许只是在每个其他构造函数调用的单个构造函数中)。纯粹的声明表明一些更复杂的事情正在进行,而将最简单的初始化移动到声明可以隐藏它。