如果Java中的类具有私有的mutator方法,它可以是不可变的吗?

时间:2018-09-18 09:00:14

标签: java oop immutability

因此,我读到某处对于在Java中不可变的类有3个要求。

  1. 所有数据字段必须为私有。
  2. 数据字段没有任何变种方法。
  3. 没有访问器方法可以返回对可变数据字段的引用。

但是我不同意#2,因为即使一个类具有mutator方法,只要这些mutator方法是私有的,它也可能是不可变的。我是对还是错?你能详细解释一下吗?

7 个答案:

答案 0 :(得分:1)

编辑

  

但是我不同意#2,因为即使一个类具有mutator方法,   只要这些mutator方法是私有的,它就可能是不可变的

因为它是一个私有增变器,所以不能保证它不会改变状态,但是只要不改变状态,它就应该保持原样,所以我们可以将其视为不变的。因为一旦设置,不变性将保持不变。

不可变只有吸气剂。设置后,无法更改其字段的值。

让我们上String类,它是不可变的

一旦创建了String对象,就不允许对其进行更改。不能将其放大或缩小,也不能更改其中的字符之一。您可以将字符串视为完全装满且侧面不会凸出的储物盒。无法添加对象,也不能在不影响整个布置的情况下替换对象。

一个类的不变性应该是这样的。

答案 1 :(得分:0)

还有其他方法可以破坏您的不可变对象。例如,反射API。 我相信,如果您决定使其不变,那么您会介意删除私有的setter方法。只是将其保留在那里没有意义。

答案 2 :(得分:0)

直接取自维基百科:

  

在面向对象的函数式编程中,不可变对象(不变对象)是创​​建后状态无法更改的对象。

因此,绝对可以肯定的是,如果您有一个带有mutator方法的类,该方法会更改对象的状态(意为类实例),则该类不是不可变的。为了将其视为不可变的,每个方法都不得更改其状态,而必须在应用了修改的情况下产生另一个相同类的对象。

答案 3 :(得分:0)

是的,对于数据字段,没有任何变种方法。

原因是设置方法private仅影响方法的范围。如果您想要一个真正不变的变量,那么还必须设置变量final。这样您的变量就无法突变。

答案 4 :(得分:0)

实际上,私人变异者的意义是什么?

Immutable表示对象的状态在创建后不能以任何方式更改。不管是通过直接访问字段,通过mutator或其他更改状态的“随机”方法,都无关紧要。所有这些都不允许类是不可变的。

答案 5 :(得分:0)

关于不变性可能有不同的定义。

您提到的定义不允许对象的任何状态更改。特别是,创建后,它无法修改自己的状态。

但是,有时将不可变对象定义为不能观察改变状态的对象。当这样定义不可变性时,如果无法从外部观察到该不可变对象的状态,则可以改变该状态。例如,可以缓存昂贵的计算结果,或者可以记录一些内部统计信息,或者类似的东西。

经常提到的不可变对象的一个​​优点是它们是自动线程安全的。重要的是要注意,只有在以强有力的方式定义不变性时(上面的第一个选项),这种优势才成立。如果只有两个线程同时访问仅更改其不可观察状态的对象,则从原理上讲它仍然可能产生错误结果,因此程序员必须格外小心,确保该对象是线程安全的。

答案 6 :(得分:-1)

Immutable并不意味着:另一个类无法更改此Object的状态,这意味着:此Object的状态永远不能更改。

考虑以下代码:

public Person {

  private String name;

  public Person(String name) {

    this.name = name;

  }

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

  public boolean hasName(String name) {
    boolean result = this.name.equals(name);
    this.name = name;
    return result;
  }
}

这不能被认为是不可变的类,因为即使在调用hasName(String name)的类中看起来不是这样,对象的状态也会改变。通常,不可变类通常将其成员声明为final,因此甚至无法编译。