如果可以使用构造函数设置所有值,为什么还要在Java中使用setter?

时间:2019-05-21 17:28:38

标签: java

我对使用setter和构造函数进行值分配感到困惑。如果可以在单个构造函数中进行设置,为什么要使用setter独立设置值。

我尝试了使用setter和construtor传递值的两种方法,但没有发现差异。需要它们之间差异的原因。

//setter 


public class NegaE {
String name;
int id;
public  void setname(String a){
    this.name=a;
}
public void setid(int  b){
    this.id=b;
}
public String getname(){
    return name;
}
public int getid(){
    return id;
}




// now through constructor



 public class NegaE {
    String name;
    int id;
   public NegaE(String a,int b){
       this.id=b;
       this.name=a;
   }
    public String getname(){
        return name;
    }
    public int getid(){
        return id;
    }

2 个答案:

答案 0 :(得分:3)

您只调用一次构造函数。如果您在构造函数中设置了值,并且没有设置器,则除非有其他具有私有访问权限的对象方法执行此操作,否则用户永远无法更改其初始值。

具有在构造函数中初始化且没有设置方法的私有最终数据成员的对象称为“不可变” ==“不变”。

这可能是一件非常好的事情。不可变的对象是线程安全的;您可以在线程之间共享它们而无需担心。这是一种更加实用的编程风格。

如果有设置员,则可以根据需要直接更新状态。这些是可变的对象。您必须小心在线程之间共享这些。可变的共享数据不是线程安全的。

答案 1 :(得分:0)

构造函数会设置初始值,但这些值必须具有随时间变化的能力,因为事情会发生变化。

设置器和获取器允许您制定规则并根据需要修改数据。 这是一个真正的基本例子。

public String setName(String name){
  if(name == null){
      throw new InvalidNameException();
  }
  this.name = name;
}


public String getName(){
    if(this.name == null){
        return "No Name here";
    }
    return this.name;
}