📜  冻结对象 |红宝石(1)

📅  最后修改于: 2023-12-03 14:50:09.409000             🧑  作者: Mango

冻结对象 | 红宝石

在Java语言中,我们常常需要对一些对象进行冻结。所谓冻结,就是对一个对象进行限制,进而使该对象的状态不能再被改变。

在Java中,实现冻结对象最常见的做法是使其成为不可变对象。不可变对象指的是对象创建后,对象的状态不能再被改变的对象。

具体实现上,我们可以采用以下两种方式:

1. final关键字

final关键字可以用来修饰变量、方法和类,用于表示它们是不可变的。

在设计不可变对象时,我们通常将对象属性都声明为final类型,并在构造函数中为其赋值。这样一来,在对象初始化完成后,它的状态就没有再被改变的可能了。

public final class Ruby {
    private final double weight;
    private final int hardness;

    public Ruby(double weight, int hardness) {
        this.weight = weight;
        this.hardness = hardness;
    }

    public double getWeight() {
        return weight;
    }

    public int getHardness() {
        return hardness;
    }
}

在以上代码中,Ruby类是一个不可变类,它的属性weight和hardness都被声明为final类型,并在构造函数中为其赋值。由于它们是不可变的,因此对象创建后,它们的状态就无法再被修改了。

2. 使用Collections.unmodifiableXXX()方法

除了使用final关键字外,我们还可以使用 Collections.unmodifiableXXX()方法来实现冻结对象。这个方法可以将一个可修改的集合对象包装成一个不可变的对象,从而达到冻结对象的目的。

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);

List<Integer> unmodifiableList = Collections.unmodifiableList(list);

unmodifiableList.add(4); // 抛出 UnsupportedOperationException 异常

在以上代码中,我们使用了Collections.unmodifiableList()方法,将一个可修改的ArrayList对象包装成了一个不可变的List对象 unmodifiableList。由于unmodifiableList是不可变的,因此对它进行修改操作时,会抛出 UnsupportedOperationException 异常。

总结:

冻结对象是保证程序健壮性和线程安全的重要手段之一。通过final关键字或Collections.unmodifiableXXX()方法的使用,我们可以轻松地实现对象的冻结,从而保证程序的正确性和健壮性。