Immutable Java:不可变对象与可变对象区别
在Java中,对象可以分为两类:可变对象(Mutable Objects)和不可变对象(Immutable Objects)。这两者的主要区别在于它们的状态是否可以在创建后被修改。
可变对象(Mutable Objects)
-
定义:可变对象是指在创建后其状态可以被改变的对象。
-
特点:
- 可以通过方法调用修改其内部状态。
- 需要考虑线程安全问题,因为多个线程可能同时修改同一个对象的状态。
- 常见的可变对象包括
StringBuilder、ArrayList、HashMap等。
-
示例:
public class MutableExample { private int value; public MutableExample(int value) { this.value = value; } public void setValue(int value) { this.value = value; } public int getValue() { return value; } } public class Main { public static void main(String[] args) { MutableExample example = new MutableExample(10); System.out.println(example.getValue()); // 输出 10 example.setValue(20); System.out.println(example.getValue()); // 输出 20 } }
不可变对象(Immutable Objects)
-
定义:不可变对象是指在创建后其状态不能被改变的对象。
-
特点:
- 一旦创建,其状态就不能通过任何方法调用进行修改。
- 天然线程安全,因为多个线程不能同时修改同一个对象的状态。
- 常见的不可变对象包括
String、Integer、Long、Double、Float、Boolean、Date(注意:Date类本身是可变的,但它的不可变性通常通过Calendar类来实现)等。
-
示例:
public final class ImmutableExample { private final int value; public ImmutableExample(int value) { this.value = value; } public int getValue() { return value; } } public class Main { public static void main(String[] args) { ImmutableExample example = new ImmutableExample(10); System.out.println(example.getValue()); // 输出 10 // example.setValue(20); // 编译错误,因为setValue方法不存在 } }
总结
- 可变对象:状态可以改变,需要注意线程安全问题。
- 不可变对象:状态不能改变,天然线程安全。
在设计类时,如果对象的状态不需要改变,或者希望对象是线程安全的,可以考虑将其设计为不可变对象。这样可以简化代码,提高性能,并减少并发问题。