【问题标题】:why use setter in java if we can set all values using construtor? [duplicate]如果我们可以使用构造函数设置所有值,为什么还要在 java 中使用 setter? [复制]
【发布时间】:2019-10-08 03:49:49
【问题描述】:

我对在赋值方面使用 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;
    }

【问题讨论】:

    标签: java


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 不正确。您不能直接更改它,但如果您在该对象上调用另一个方法,它可以根据其实现更新状态。你说没有对状态的直接写访问是一件坏事。确实,有时候这是一件非常好的事情。有人会说这种函数式风格比面向对象好。
    【解决方案2】:

    构造函数设置初始值,但这些值需要能够随着时间的推移而变化,因为事情会发生变化。

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

    【讨论】:

      猜你喜欢
      • 2021-04-07
      • 2018-01-23
      • 1970-01-01
      • 2018-05-17
      • 2022-01-06
      • 1970-01-01
      • 2012-10-03
      相关资源
      最近更新 更多