构造函数中的Java在调用类的setter或直接传递值方面更好吗?

时间:2013-03-11 11:04:25

标签: java constructor setter

class Foo(){

String name;

public Foo(String name){
   //code to be inserted
}

public void setName(String name){
   this.name = name;
}

}

在缺失行中插入更好的内容以及原因:

1。)this.name = name;

2。)setName(name);

5 个答案:

答案 0 :(得分:6)

由你决定。

例如,如果要在传递给构造函数的属性上执行某些验证,然后将其存储在name变量中,请调用setter。

但是如果你想避免这种验证,或者如果你的setter可能抛出异常,请直接分配变量。

这里最重要的是在构造函数方法的末尾创建了一致的实例。

答案 1 :(得分:2)

setName(name); 

万一你在setter中添加了一些检查,否则你可以避免使用setter。

例如

public void setWeight(int weight){
  if(weight<=0)
    this.weight = 50;  // set some default/average weight
  else
    this.weight = weight;
}

答案 2 :(得分:1)

一般来说,安装者呼叫更安全。 setter可能有其他逻辑:

  1. 数据验证
  2. 状态更新:例如,设置集合的容量有时意味着将数据复制到更大的容器中。
  3. 状态更新以维护类不变量:设置一个字段可能需要在另一个字段中进行更改以使它们保持一致。

答案 3 :(得分:0)

class Foo(){

   String name;

   public Foo(String name){
      this.name = name;    
   }

}

设置名称时,您可以调用Foo(name)

答案 4 :(得分:0)

在我看来,最好的方法是传递setter方法中的值和在为该类创建对象时更重要的值,然后在构造函数中传递它们。

如果你试图传递构造函数中的所有值,那么当你的类增长时,如果有太多的参数来创建对象,它将变得更大更难看。

因此,例如,假设您的类Foo依赖于属性int id,并假设您需要始终基于此id在构造函数中执行某些逻辑。 因此,您将创建一个传递此id的构造函数。然后使用setter方法将值添加到该对象的属性中。

  Foo(int id){

  }