为什么final关键字对于不可变的类是必需的?

您能否澄清一下,为什么在我们将 关键字设为不变时,为什么 在上课之前需要

关键字。我的意思是,如果我们将所有属性声明为私有和最终的,那么它也是一个不可变的类,不是吗?

很抱歉,这个问题似乎很简单,但是我对此感到非常困惑。帮帮我。

编辑:我知道一个声明为final的类不能被子类化。但是如果每个属性都是私有和final的,那有什么区别呢?

回答:

正如堆纸器所说的那样,final确保该类没有被子类化。这很重要,因此任何 依赖 其不变性的代码都可以安全地这样做。

例如,不可变类型(每个字段也是不可变类型)可以在线程之间自由使用,而不必担心数据争用等。现在考虑:

public class Person {

private final String name;

public Person(String name) {

this.name = name;

}

public String getName() {

return name;

}

}

看起来 喜欢你可以分享Person没有问题的自由跨线程的实例。但是,当您共享的对象 实际上是 一个可变子类时,该怎么办:

public class Employee extends Person {

private String company;

public Employee(String name, String company) {

super(name);

this.company = company;

}

public void setCompany(String company) {

this.company = company;

}

public String getCompany() {

return company;

}

}

现在,Employee不可以 在线程之间共享实例,因为它们不是不可变的。但是进行共享的代码 可能

只将它们作为Person…的实例来了解,从而导致它们产生错误的安全感。

缓存也是如此-缓存和重用不可变类型应该是安全的,对吗?那么,它 安全的缓存实例那些真正不可变型的-但如果你正在处理一个类型本身不允许突变,但

不会 允许子类,它是突然不是安全了。

想一想java.lang.Object。它没有任何可变字段,但是将每个Object引用都视为对不变类型的引用显然是一个坏主意。基本上,这取决于您是否将不变性视为类型或对象的属性。真正不可变的类型声明“任何时候看到这种类型的引用,您都可以将其视为不可变的”

–而允许任意子类化的类型则不能声明该声明。

顺便说一句,有一个半途而废的方法:如果您可以将子类别限制为仅“受信任”的位置,则可以确保所有内容都是不可变的,但仍允许该子类别。Java中的访问使这一点变得棘手,但是例如在C#中,您可以有一个公共类,该公共类只允许在同一程序集中进行子类化-

提供一个在不可变性方面很好并且很强的公共API,同时仍然允许多态性的好处。

以上是 为什么final关键字对于不可变的类是必需的? 的全部内容, 来源链接: utcz.com/qa/397284.html

回到顶部