如果我们可以使用construtor设置所有值,为什么要在java中使用setter?

如果我们可以使用construtor设置所有值,为什么要在java中使用setter?,java,Java,我对setter和constructor在赋值方面的用法感到困惑。如果我们可以在单个构造函数中独立设置值,为什么我们要使用setter来独立设置值 我尝试过使用setter和construtor传递值的两种方法,没有发现任何差异。需要他们之间差异的原因 //setter public class NegaE { String name; int id; public void setname(String a){ this.name=a; } public void setid(

我对setter和constructor在赋值方面的用法感到困惑。如果我们可以在单个构造函数中独立设置值,为什么我们要使用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;
    }

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

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

这可能是一件非常好的事情。不可变对象是线程安全的;您可以在线程之间毫无顾虑地共享它们。这是一种功能性更强的编程风格


如果您有setter,您可以根据需要直接更新状态。这些是可变对象。您必须小心地跨线程共享这些内容。可变的共享数据不是线程安全的。

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

setter和getter允许您制定规则并在需要时修改数据。 这里有一个真正的基本例子来说明这一点

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;
}

不是真的。您不能直接更改它,但是如果您对该对象调用另一个方法,它可以根据其实现更新状态。你说没有对州的直接写访问权是一件坏事。确实,有时候这是一件非常好的事情。有些人会说这种功能性风格比面向对象的要好。