java - 这个类是不可变的吗?

标签 java

以下类(class)没有 final关键字,但它的成员变量是 privatefinal并且该类没有公开 mutate/set 方法。这个类是不可变的吗?

public class Abc {

    private final int id;
    private final String name;

    public Abc(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public int getId() {
        return id;
    }
}

最佳答案

类本身是不可变的,是的 - 如果您仅创建 Abc 的实例,在创建实例后,任何方面都无法更改。
但是,这并不意味着任何代码都会接收类型为 Abc 的参数。可以假设它具有不可变的所有优点...因为该类不是 final .与 Abc 兼容的类型的对象完全有可能可变:

public class Mutable extends Abc {
    private String value;

    public Mutable(int id, String name) {
        super(id, name);
    }

    public void setValue(String value) {
        this.value = value;
    }

    @Override public String toString() {
        return value;
    }
}
现在假设您有处理 Abc 的代码。 :
public class AbcConsumer {

    private final Abc abc;

    public AbcConsumer(Abc abc) {
        this.abc = abc;
    }

    // No need to create a defensive copy or anything like that...
    // abc is immutable, right?
    public Abc getAbc() {
        return abc;
    }
}
在这里,消费者认为可以治疗 Abc好像它是一个不可变的类 - 但是如果有人创建了一个 AbcConsumer通过传入 Mutable实例而不是“ Vanilla ”Abc例如,它可能会导致问题。
这就是为什么在创建不可变类型以使其成为final 时通常是个好主意的原因。同样 - 这样任何消费者都知道,如果他们收到该类型的引用,它绝对是不可变的。
换句话说:是的,Abc类是不可变的...但你不能假设一个编译时类型为 Abc 的引用指的是一个不可变的对象。

关于java - 这个类是不可变的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66519121/

相关文章:

java - gradle 同步时出错

java - 正则表达式删除 2 个字符串之间的所有内容

java - JPA (Hibernate) 上的多个双向映射问题

java - 我可以像初始化成员/字段变量一样在方法之外初始化数组吗

java - 如何在Java中复制和操作源代码

java - 在 For 循环增量中使用 if else

java - 如何使用不在 "Query-Collection"中的值对 Firestore RecyclerView 项目进行排序? (社交排行榜)

java - 如何用不同的方法绘制 Sprite libgdx

java - NoClassDefFound错误: javax/servlet/Filter (Objectify Upgrade)

java - 从线程中获取消息