Java变量是否应在声明时初始化?

时间:2015-09-03 03:08:36

标签: java

简单的问题,但有兴趣知道在声明中初始化Java变量是否是好的做法?我并不是真的一致;我倾向于初始化布尔,但没有别的。例如:

private Boolean test = false;
private Integer count;

我确信这是一个非常基本的问题,但我很想知道原因和时间?

4 个答案:

答案 0 :(得分:3)

Java Practices开始,JVM将隐式设置以下默认值:

  • 数字:0或0.0
  • booleans:false
  • 对象引用:null

实际上,如果您明确设置了这些值,则可能会导致操作两次。看看下面的示例类及其使用Oracle javac编译的字节码:

public final class Quark {

  public Quark(String aName, double aMass){
    fName = aName;
    fMass = aMass;
  }

  //PRIVATE

  //WITHOUT redundant initialization to default values
  //private String fName;
  //private double fMass;

  //WITH redundant initialization to default values
  private String fName = null;
  private double fMass = 0.0d;
} 

没有冗余

>javap -c -classpath . Quark 
Compiled from Quark.java 
public final class Quark extends java.lang.Object { 
    public Quark(java.lang.String,double); 
}
Method Quark(java.lang.String,double) 
   0 aload_0 
   1 invokespecial #1 <Method java.lang.Object()> 
   4 aload_0 
   5 aload_1 
   6 putfield #2 <Field java.lang.String fName> 
   9 aload_0 
  10 dload_2 
  11 putfield #3 <Field double fMass> 
  14 return

冗余:

>javap -c -classpath . Quark 
Compiled from Quark.java 
public final class Quark extends java.lang.Object { 
    public Quark(java.lang.String,double); 
}
Method Quark(java.lang.String,double) 
   0 aload_0 
   1 invokespecial #1 <Method java.lang.Object()> 
   4 aload_0 
   5 aconst_null 
   6 putfield #2 <Field java.lang.String fName> 
   9 aload_0 
  10 dconst_0 
  11 putfield #3 <Field double fMass> 
  14 aload_0 
  15 aload_1 
  16 putfield #2 <Field java.lang.String fName> 
  19 aload_0 
  20 dload_2 
  21 putfield #3 <Field double fMass> 
  24 return

答案 1 :(得分:1)

这甚至可能是基于意见的解决方案,但我通常会避免在声明时初始化它(如下所示)。由于原始数据类型具有默认值且对象具有空引用,因此也会出现我初始化的情况。

但是,我在这种情况下初始化了:

public class Initializer{
   private List<String> list = new ArrayList<>();

//Getters and //Setters

}

这是基于意见的观点。我单独初始化Array和其他Collection,因为它们有时会在我的服务层上导致NullPointerException。是的,人们会建议修改Getters。但我更喜欢只在某些事件中初始化而不是每次都初始化。

答案 2 :(得分:0)

意见: 字段有明确定义的默认值(null,0,false),除非需要初始化,否则不应初始化它们非默认值。

但是你的问题标题是变量,我的意见是你也不应该初始化变量,除非需要。 &#34;需要&#34;在初始化之前,变量是int a = 0; if (/*insert expression here*/) a = 10; else a = 20; (不是垃圾)。除非该变量为definitely assigned,否则您无法从变量中检索值。

我有时会看到以下内容:

<div id="test">test</div>

初始化程序是无关紧要的,无用的,并且具有误导性。 (我的真实意见使用更强的词)

答案 3 :(得分:0)

我说原语,没有。对象,是的。如果没有其他原因,只要明确清楚何时你想要初始化为null的东西。这也有助于在调试时阐明一些空值。