gpt4 book ai didi

java - 给定一个可变类,如何使这个类的特定对象不可变?

转载 作者:行者123 更新时间:2023-12-02 16:30:41 24 4
gpt4 key购买 nike

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

class Animal {
private String name;
private String commentary;

public Animal(String nombre, String comentario) {
this.name = nombre;
this.commentary = comentario;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Animal animal = (Animal) o;
return Objects.equals(name, animal.name);
}

@Override
public int hashCode() {
return Objects.hash(name);
}

public String getName() {
return name;
}

public String getCommentary() {
return commentary;
}

public void setCommentary(String commentary) {
this.commentary = commentary;
}

public void setName(String name) {
this.name = name;
}
}

最佳答案

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

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"));
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");
}
}

关于java - 给定一个可变类,如何使这个类的特定对象不可变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63541155/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com