Java 给定一个可变类,如何使该类的特定对象不可变?

Java 给定一个可变类,如何使该类的特定对象不可变?,java,object,design-patterns,immutability,access-modifiers,Java,Object,Design Patterns,Immutability,Access Modifiers,我得到了这个类,它对于我创建的每个实例都是可变的,但是我想知道是否有 某种包装器(或其他东西),使该类的一个特定对象不可变。e、 gCollections.unmodifiableList(beanList) 我知道的唯一方法是实例化它并重写能够修改特定实例的方法: Animal animal = new Animal("name", "commentary") { @Override public void setCommentary(

我得到了这个类,它对于我创建的每个实例都是可变的,但是我想知道是否有
某种包装器(或其他东西),使该类的一个特定对象不可变。e、 g
Collections.unmodifiableList(beanList)


我知道的唯一方法是实例化它并重写能够修改特定实例的方法:

Animal animal = new Animal("name", "commentary") {

    @Override
    public void setCommentary(String commentary) {
        throw new UnsupportedOperationException("The Animal is immutable");
    }

    @Override
    public void setName(String name) {
        throw new UnsupportedOperationException("The Animal is immutable");
    }
};
这也满足了只有一个类的特定实例具有特殊行为的条件


如果您需要更多,可以创建一个包装类作为装饰器(不完全是)。不要忘记将类设置为final,否则您将能够用我上面描述的方式重写它的方法,并且它的不变性可能会破坏

Animal animal = new ImmutableAnimal(new Animal("name", "commentary"));

除非您为这个特定的类创建一个通用的方法,否则不会有通用的方法来实现它。这是因为不可能知道类的哪些方法正在进行变异。抛出
IllegalArgumentException
集合是很奇怪的。unmodifiableList(beanList)
返回一个不可修改的列表,但是修改
beanList
也会修改列表。
newImmutableAnimal(anAnmial)
返回的对象即使更改
anAnimal
@saka129也不会更改:这是我心目中的第一个运行时异常。现在我觉得不支持操作异常更合适。它会改变答案的质量吗?
Animal animal = new ImmutableAnimal(new Animal("name", "commentary"));
final class ImmutableAnimal extends Animal {

    public ImmutableAnimal(Animal animal) {
        super(animal.getName(), animal.getCommentary());
    }

    @Override
    public void setCommentary(String commentary) {
        throw new UnsupportedOperationException("The Animal is immutable");
    }

    @Override
    public void setName(String name) {
        throw new UnsupportedOperationException("The Animal is immutable");
    }
}