解释什么是不可变对象(immutable object)?
参考答案:
不可变对象(Immutable Objects)即对象一旦被创建它的状态(对象的数据,也即对象属性值)就不能改变,反之即为可变对象(Mutable Objects)。 不可变对象的类即为不可变类(Immutable Class)。Java 平台类库中包含许多不可变类,如 String、基本类型的包装类、BigInteger 和 BigDecimal 等。 不可变对象天生是线程安全的。它们的常量(域)是在构造函数中创建的。既然它们的状态无法修改,这些常量永远不会变。
图文解析点击查看
不可变对象(Immutable Object)是指一旦创建后,其状态就不能被修改或改变的对象。在Java中,不可变对象具有以下特征:
1.状态不可变性(State Immunity):对象的属性值不能被修改。
2.线程安全性(Thread Safety):由于不可变对象的状态不能改变,多线程访问时不需要额外的同步措施,因此是线程安全的。
3.安全性(Security):不可变对象的值不能被恶意修改,因此适用于安全敏感的上下文。
4.可重用性(Reusability):由于不可变对象的状态不变,可以在不担心副作用的情况下多次使用。
要创建一个不可变对象,需要采取以下几个步骤: 1.使类声明为final 通过将类声明为final,防止其他类继承该类,从而防止子类修改其状态。
2.声明属性为private和final 确保属性不能被外部直接访问,并且一旦赋值后就不能再修改。
3.不提供修改状态的方法 不要提供修改对象状态的方法,包括setter方法。
4.提供只读方法 提供方法来获取对象的属性值,但不要提供方法来修改属性值。
以下是一个示例,演示如何创建一个不可变的Java类:
public final class ImmutablePerson {
private final String name;
private final int age;
public ImmutablePerson(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
在这个示例中,ImmutablePerson类具有两个私有的final属性,它们只能在构造函数中初始化,并且没有提供修改它们的方法。因此,ImmutablePerson是一个不可变对象,一旦创建就不能修改其状态。
通过遵循上述模式,我们可以创建不可变对象,这有助于确保代码的可维护性、线程安全性和安全性。