本文向您展示Java中Mutable和Immutable对象之间的区别
1. 可变对象 –创建对象后,您可以更改状态和字段。 例如: StringBuilder
, java.util.Date
等。
2. 不可变对象 –创建对象后,您将无法进行任何更改。 例如: String
,装箱的原始对象,例如Integer
, Long
等。
1. Java可变示例
通常,它提供了一种修改字段值的方法,并且可以扩展对象。
MutableExample.java
package com.mkyong;
public class MutableExample {
private String name;
MutableClass(String name) {
this.name = name;
}
public String getName() {
return name;
}
// this setter can modify the name
public void setName(String name) {
this.name = name;
}
public static void main(String[] args) {
MutableExample obj = new MutableExample("mkyong");
System.out.println(obj.getName());
// update the name, this object is mutable
obj.setName("new mkyong");
System.out.println(obj.getName());
}
}
输出量
mkyong
new mkyong
2. Java不可变示例
要创建Immutable对象,请将类定为final,并且不提供任何修改字段的方法。
ImmutableExample.java
package com.mkyong;
// make this class final, no one can extend this class
public final class ImmutableExample {
private String name;
ImmutableExample (String name) {
this.name = name;
}
public String getName() {
return name;
}
//no setter
public static void main(String[] args) {
ImmutableExample obj = new ImmutableExample("mkyong");
System.out.println(obj.getName());
// there is no way to update the name after the object is created.
// obj.setName("new mkyong");
// System.out.println(obj.getName());
}
}
输出量
mkyong
注意
不可变对象简单,线程安全(不需要同步),不易出错且更安全。 如果可能,使所有对象不变。
附言:请参阅《有效Java书籍》第15项:最小化可变性。
参考文献
翻译自: https://mkyong.com/java/java-mutable-and-immutable-objects/