是否所有的final类不可变的?(Are all final class immutable?)

2019-09-01 12:57发布

在Java中所有的final类不可变的。 字符串和整数都是final类,无一不是不可改变我beleive。

Answer 1:

否 - final类意味着你不能继承它。 它无关,与可变性。 下面的类是最终又易变:

public final class FinalMutable {
  int value;
  public void setValue(int v) { value=v; }
  public int getValue() { return value; }
}


Answer 2:

没有,最终意味着类不能扩展。 它没有提到的可变性。 例如:

final class MutInt {
   public int modifyMe;
}


Answer 3:

没有为不变性没有关键字,它更像一个设计模式。

编辑:
这意味着,在没有关键字,使一类不可变的。 若要使类不可变的,你要保护的内部通过使他们最终还是私人的。

混淆的是这样的:上,它已在一个字段/变量用于当一个类一起使用时,最终关键字有不同的含义。 前者的意思是“这个类不能扩展”。 第二装置“这个变量(或参考)不能改变”。



Answer 4:

另外其他的反应,如果你看的代码java.lang.String你会看到它包含一个字段: hash ,这是可变的 ,实际上是在计算和存储时hashCode()被调用的第一次。

然而,类是不可变的仍然:该hash字段不能被直接访问或类的外部修改。

另外,可能会发现的常用方法中的JDK是可用于曝光的对象的内部状态不变的包装纸而不允许它被修改的实施; 例如

private final List<String> values;

public List<? get String> getValues() {
  return Collections.unmodifiableList(values);
}


Answer 5:

如已被别人说前final尽管它在不变性战略的一部分不会使Java中的类imuutable。 为了得到永恒,你应遵循的一般guidlines:

  • 确保类不能被覆盖-使课堂final ,或者使用静态工厂,并保持构造私人
  • 使场privatefinal
  • 力呼叫者完全构造对象在单个步骤中,而不是使用一个无参数的构造与后续调用组合以setXXX方法(即,避免在Java Beans约定)
  • 不提供能够以任何方式更改对象的状态的任何方法-不只是setXXX方法,但可以改变状态的任何方法
  • 如果类有任何可变对象的字段,那么他们必须在防守类和它的调用者之间传递时被复制


Answer 6:

私有字段不能由子类的重写方法进行访问。所以没有办法的子类中的方法改变超类的私有字段...那么什么用使得不可变类为final的?



Answer 7:

final关键字防止其他类继承它。 final关键字并不能使它一成不变的,但也有这样的条件为使实例类成员私人以及最终通过使用getter和不使用setter方法



Answer 8:

最后一个一成不变的类不能突变。 这里在其下方显示正在突变非最终不可变类:

// a class not intended to be mutated 
public class GoodClass{

   private String name;

   public GoodClass() {
       this.name = "Good Class Neme";
   }

   public String getName() {
       return name;
   }
}

public class BadClass extends GoodClass {

   private String name;

   public String getName() {
       return name;
   }

   // mutating state
   public void setName(String name) {
       this.name = name;
   }
}





文章来源: Are all final class immutable?