面试题:什么是 Java 中的不可变类?

在Java中,不可变类(Immutable Class)是指一旦一个对象被创建并且初始化后,其状态就不能再被改变的类。这意味着该对象的属性在对象创建之后不能被修改,任何对它的“修改”操作都会返回一个新的对象而不是修改原来的对象。

不可变类的特点

  1. 所有字段都是final:确保了字段值一旦赋值就不会改变。
  2. 没有修改器方法(Setter方法):不提供用于更改对象状态的方法。
  3. 所有可变组件都是私有的,并且不会泄露引用:如果不可变类包含可变类型的成员变量,则必须确保这些成员变量不会被外部访问或修改。通常的做法是对可变成员进行深拷贝或者完全避免使用可变成员。
  4. 类本身被声明为final:防止通过继承的方式覆盖父类的方法来破坏不可变性。

创建不可变类的例子

public final class ImmutableClass {
    private final int id;
    private final String name;

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

    public int getId() {
        return id;
    }

    public String getName() {
        // 如果name是可变类型,这里应该返回副本而不是直接返回引用
        return name;
    }

    // 没有setter方法
}

优点

  • 线程安全:因为不可变对象的状态不能改变,所以在多线程环境下不需要担心同步问题。
  • 简化编程模型:由于不可变对象的状态不会改变,因此更容易理解和预测它们的行为。
  • 减少错误:减少了由于意外修改对象状态而导致的bug。

常见的不可变类

Java标准库中有几个著名的不可变类,比如StringIntegerDouble等包装类,以及BigIntegerBigDecimal等。这些类的设计保证了即使是在并发环境中也能安全地使用。

注意事项

虽然不可变类有很多优点,但是它们并不是万能的。例如,每次对不可变对象执行“修改”操作时实际上都会创建一个新的对象,这可能导致较高的内存消耗和性能开销。因此,在设计时需要权衡是否适合使用不可变模式,特别是在处理大量数据或频繁变更的对象时。此外,对于大型或复杂的对象,可能需要考虑使用可变对象以提高效率。

THE END
喜欢就支持一下吧
点赞5 分享