域的初始化方法一般有3种:
1. initializer:在域的声明中赋一个默认值
2. constructor:在构造器中设置值
3. initialization block:在初始化块中设置值其中关于构造器的使用,有一个耐人寻味的地方:
假设有这样一个Employee类:class Employee
{
  private int staffId;
  private static int nextId = 0;
  private String name = "<unnamed>";
  private String address = null;
  
  Employee()
  {
    staffId = nextId++;
  }
}无参构造器肯定是首先必须出现的,这个没有疑问,可是一个参数的构造器和两个参数的构造器,哪一个先出来比较好呢?或者换个说法,是让两个参数的构造器调用一个参数的构造器好一些?还是让一个参数的构造器调用两个参数的构造器好一些呢?//情形1:在两个参数构造器中调用一个参数的构造器:
  Employee(String name)
  {
    this();
    this.name = name;
  }
  
  Employee(String name, String address)
  {
    this(name); //两参数构造器内部调用一参构造器
    this.address = address;
  }//情形2:在一个参数构造器中调用两个参数的构造器  
  Employee(String name, String address)
  {
    this();
    this.name = name;
    this.address = address;
  }
  
  Employee(String name)
  {
    this(name, null);//一参构造器内部调用两参数构造器
  }
}以上两种写法,哪一种更符合Java规范,哪一种效率更高呢?

解决方案 »

  1.   

    最好的方法,放在一个块里这样就不用调用,class Employee
    {
      private int staffId;
      private static int nextId = 0;
      private String name = "<unnamed>";
      private String address = null;
      
      //放在块里
      {
      nextId++;
      }
      
      Employee()
      {
      }
      
      Employee(String name)
      {
        this.name = name;
      }
      
      Employee(String name, String address)
      {
        this(name); //两参数构造器内部调用一参构造器
        this.address = address;
      }
    }
      

  2.   

    ZangXT大侠能现身给个说法么?
      

  3.   

    这个原则上说没有什么规范,但一般来说,下面这种安排是最好的:Employee() {
      this(null, null);
    }Employee(String name) {
      this(name, null);
    }Employee(String name, String address) {
      staffId = nextId++;
      this.name = name;
      this.address = address;
    }也就是说,让一个带有完整参数列表的构造器执行所有实际的工作,其他的构造器都调用这个构造器。这样的话,如果需要更改初始化逻辑,只需要改最后一个构造器内代码即可。这种情况下,其他的构造器其实仅仅是提供给用户的接口而已。