【问题标题】:How to set up instance variables of the object in Java? [duplicate]如何在 Java 中设置对象的实例变量? [复制]
【发布时间】:2023-04-03 07:35:01
【问题描述】:

这个问题与具体问题无关,而是一个普遍问题。在 Java 中,当创建一个类时,实际上有两个选项可以访问该类的实例变量:

  1. 通过创建一个构造函数,该构造函数将拥有一个参数列表,用于设置实例变量的值。

  2. 通过向类添加 setter(和 getter)方法来设置实例变量。

所以现在我想知道:实际上哪个选项更好?我还读到,在创建对象时不设置实例变量不是一个好方法,建议为它们设置一些值。真的吗?在这种情况下,我会认为第一个选项更好。

【问题讨论】:

  • 视情况而定?通常,当有多个选项时,没有一种方法最适合所有情况。

标签: java variables object constructor


【解决方案1】:

除非在构造后迫切需要更改值,否则我强烈建议在构造函数中设置字段。原因是只能将构造函数中设置的字段设置为immutable,而不变性是一件非常好的事情,因为它使类无法通过反射或任何其他方式进行更改。

final 字段的示例:

public class MyClass  {
   private final int id;
   public MyClass(int id)  {
      this.id = id;
   }

当一个字段在 setter 中可更改时,锁定类的唯一方法是进行检查,例如

public void setID(int id)  {
   if(id != -1)  {
      throw  new IllegalStateException("Already set!");
   }
   this.id = id;
}

或者通过某种方式锁定整个对象:

public void lock()  {
   if(getID() == -1)  {
      throw  new IllegalStateException("Must first setID(i).");
   }
   isLocked = true;
}
public void setID(int id)  {
   if(isLocked())  {
      throw  new IllegalStateException("isLocked() is true.");
   }
   this.id = id;
}

显然,在构造函数中设置字段要简单得多。

【讨论】:

  • @MichalB:如果您觉得这个答案对您有所帮助,请考虑投票并接受它。谢谢!
【解决方案2】:

如果您认为它们与对象创建有某种关联,请将它们放入构造函数中。例如创建一个正方形,你需要它的大小,但添加颜色不是强制性的 所以在这种情况下,长度将在构造函数中设置,颜色将通过 setter 方法设置。

【讨论】:

    【解决方案3】:

    这完全取决于软件设计和意图,是否有在没有所有参数的情况下创建新对象的用例?一些参数? Getter/Setter 和其他内部方法都应该在执行任何工作之前检查输入/数据 - 这可以确保在继续之前检查您可能做出的任何假设。

    【讨论】:

      【解决方案4】:

      对我来说使用Constructor 方法:

      如果你想要对象Ready to Use

      Setters 用于对象的进一步更改。

      【讨论】:

        【解决方案5】:

        构造函数的纯面向对象思想是创建一个实例,该实例处于一致状态。构造函数有责任确保不能创建不一致的实例。然后,该实例的每个方法都有责任将实例从一致状态转移到另一个一致状态。

        因此,我总是建议在必须验证所有输入参数的构造函数中强制设置实例变量。

        如果允许修改某些实例变量,请提供一个 setter。为了使想法一致,请在构造函数中使用该设置器!为防止构造函数污染,您应该至少拥有一个构造函数,该构造函数采用所有强制属性值,您无法为其提供任何合理的默认值或您不想为其提供 setter,因为它们的值在构造后是最终的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-08-25
          • 2013-12-07
          • 2018-07-18
          • 1970-01-01
          • 2014-02-25
          • 2017-03-19
          • 1970-01-01
          相关资源
          最近更新 更多