繁体   English   中英

它是不可变的类吗?

[英]Is It Immutable Class?

这下课是一成不变的吗?

class Immutable {

  private int x;

  Immutable(int value) {
    this.x = value;
  }

  public int getX(){
    return x;
  }
}
  1. 类不是最终的,因为子类看不到任何成员

  2. 实例变量x不是最终变量,因为没有设置方法。

此类在不添加任何代码的情况下是否有可能打破不可变功能的约定?

该类实际上是不可变的。

但是您仍然可以使用反射来设置变量x的值,因为该变量不是最终变量。

Immutable类是不可变的。

但是,可以声明其实例是可变的Immutable的子类。 确实,防止这种情况的唯一方法是使此类成为final ...或将其构造函数设为私有。

您可能会((我会)认为)可变的Immutable子类违反了Immutable的约定。


使用反射更改x值的方法违反了规则。 Java规范说未指定执行此操作的应用程序的行为。 (当然,它打破了JLS说允许JIT编译器进行的各种假设。)

一个明智的开发人员不会做这种事情,会轻视别人做某事的可能性,并且会说尽管某些疯子可能会改变它,但Immutable是不可变的。

约书亚·布洛赫(Joshua Bloch)在他的“有效Java”中指出: “您应该为可扩展性设计类,或者使它们不可扩展”

如果灵活性是您的首要考虑因素,并且您有充分的理由设计不可变的类进行继承-请将该类保留为非最终类。

如果您担心安全性-将该课程定为最终课程,将成员字段定为最终课程。 因为:

  • 通过覆盖getter方法,可以扩展非最终类以创建可变的子类。

  • Java在设计上是反射性的。 正如Belgther所说,可以使用反射来设置member field的值。 (无论是私有的还是公共的)很久以前, 我使用它来将我的特定调试器与另一个项目集成在一起。

是的,在我看来,这是一成不变的。

因为您有一个只能在构造函数中设置的私有字段,并且该类中的唯一方法是getter,所以该字段不能再被修改,并且该类可以说是不可变的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM