gpt4 book ai didi

java - 修改列表不应影响其对象 - Java

转载 作者:行者123 更新时间:2023-12-01 19:29:07 27 4
gpt4 key购买 nike

我有一堂蝴蝶课:

public class Butterfly extends Insect {

/**
* Field to hold the list of colors that a butterfly object is.
*/
private List<String> colors;

/**
* Constructor to initialize the fields.
*
* @param species - Species of Butterfly.
*/
public Butterfly(String species, List<String> colors) {
super(species);
this.colors = colors;
}

/**
* Constructor to initialize an existing Butterfly object.
*
* @param butterfly - Butterfly object
*/
public Butterfly(Butterfly butterfly) {
this(butterfly.getSpecies(), butterfly.getColors());
}

/**
* Getter for the colors of the butterfly.
*
* @return the colors - Colors of the butterfly.
*/
public List<String> getColors() {
return colors;
}

@Override
public String toString() {
return getSpecies() + " " + colors;
}

}

还有一个给我带来问题的 JUnit 测试用例:

@Test
void butterfly_immutable() {
List<String> colors = new ArrayList<>();
Collections.addAll(colors, "orange", "black", "white");

Butterfly b1 = new Butterfly("Monarch", colors);
Butterfly b2 = new Butterfly(b1);

// Modifying the original color list should not affect b1 or b2.
colors.set(0, "pink");

// Modifying the colors returned by the getters should not affect b1 or b2
List<String> b1Colors = b1.getColors();
b1Colors.set(1, "lime");
List<String> b2Colors = b2.getColors();
b2Colors.set(1, "cyan");

assertTrue(sameColors(List.of("orange", "black", "white"), b1.getColors()));
assertTrue(sameColors(List.of("orange", "black", "white"), b2.getColors()));
}

我的问题是:如果颜色本身被修改,如何防止改变蝴蝶对象的颜色。我尝试过使用 List.of、List.copyOf、Collections.unmodifyingList,但我似乎无法弄清楚这一点。任何帮助将不胜感激。预先感谢您!

最佳答案

换行

this.colors = colors;

this.colors = List.copyOf(colors);

这将使 Butterfly.colors 字段成为传递到构造函数的 List 的不可修改的副本。

如果您希望 Butterfly 能够以其他方式进行修改,您可以在构造函数中创建一个可变副本,但您还必须在“getter”中进行复制。

this.colors = ArrayList<>(colors);

public List<String> getColors() {
return List.copyOf(colors);
}

(从技术上讲,ArrayList 构造函数可以被击败,但您通常不必担心这一点。)

关于java - 修改列表不应影响其对象 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60356635/

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