有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java变量应该在声明时初始化吗?

这是一个简单的问题,但有兴趣知道在声明中初始化Java变量是否是一个好的实践吗?我不是很始终如一;我倾向于初始化布尔值,但除此之外什么都不初始化。例如:

private Boolean test = false;
private Integer count;

我确信这是一个非常基本的问题,但我有兴趣知道原因和时间


共 (4) 个答案

  1. # 1 楼答案

    我说的是原语,不是,是对象。如果没有其他原因,只是为了明确说明何时需要将某些内容初始化为null。这也有助于在调试时阐明一些空值

  2. # 2 楼答案

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

    但是,在本例中,我已初始化:

    public class Initializer{
       private List<String> list = new ArrayList<>();
    
    //Getters and //Setters
    
    }
    

    这当然是基于观点的。我单独初始化Array和其他Collection,因为有时它们会在我的服务层上引起NullPointerException。是的,人们会建议改为修改getter。但我更喜欢只在某些情况下初始化,而不是每次

  3. # 3 楼答案

    JVM将从Java Practices隐式设置以下默认值:

    • 数字:0或0.0
    • 布尔人:错
    • 对象引用: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
    
  4. # 4 楼答案

    意见:字段具有定义良好的默认值(null、0、false),除非需要将它们初始化为非默认值,否则不应初始化它们

    然而,您的问题标题是关于变量,我的意见是,您也不应该初始化变量,除非需要。“需要”是关于变量在初始化之前是undefined(不是垃圾)。除非变量为definitely assigned,否则无法从变量中检索值

    我有时会看到以下情况:

    int a = 0;
    if (/*insert expression here*/)
        a = 10;
    else
        a = 20;
    

    初始值设定项是无关的、无用的和误导性的(我的真实观点使用了更有力的词语)