gpt4 book ai didi

java - 直接修改对象还是返回对象的修改克隆更好?

转载 作者:行者123 更新时间:2023-11-29 05:13:44 26 4
gpt4 key购买 nike

问题是我无法修改我正在从内部编写的对象,因此创建了一个我修改并返回的克隆。但是,在其他函数中我直接修改调用方法的对象。我希望并且人们也建议保持一致,这样用户就可以对返回的克隆执行任何他们喜欢的操作,而无需修改实际对象。

我必须在某些函数中返回对象的修改后的克隆,因为没有办法绕过它(我知道)。连同标题中的问题,是采用一致的做事方式更好(导致我返回克隆以进行哪怕是最微小的更改),还是如果我有不同的方式来响应同一类中的用户是否可以?

[编辑]这样做更好吗:

 public Image fillWithColor(Color fillColor) {
Image newImage = new Image(this.getWidth(), this.getHeight(), this.getType());

for (int x = 0; x < this.getWidth(); x++) {
for (int y = 0; y < this.getHeight(); y++) {
newImage.setPixel(x, y, fillColor.getRGB());
}
}

return newImage;
}

或者这个:

public void fillWithColor(Color fillColor) {
for (int x = 0; x < this.getWidth(); x++) {
for (int y = 0; y < this.getHeight(); y++) {
this.setPixel(x, y, fillColor.getRGB());
}
}
}

最佳答案

出于各种重要原因,大趋势是将尽可能多的数据视为只读。今天甚至数据库也这样做。

您显然已经认识到不受控制地修改数据会给您带来麻烦。非常好。尝试将数据设计为不可变对象(immutable对象),从长远来看,很多事情都会变得容易得多。请注意,Java 中的某些数据结构本质上是可变的(数组、哈希表等),并且注定和预期会发生变化。

在上面的示例中,我会选择第一个变体。为什么?复制图像可能会花费几微秒和一些 RAM,而不是就地更新。但是您可以保留旧图像,根据您的应用,这可能是有益的。此外,您可以在 10 个不同的线程中使用 10 种不同的填充颜色并行为同一图像着色,并且不会出现锁定问题。

话虽如此,仍然无法回答您的问题,如“总是更好......”。这取决于您的问题、您的环境、编程语言、您使用的库以及许多其他因素。

这么说吧,在大多数情况下,不可变数据是更可取的,除非有严重的理由反对它。 (节省几微秒的执行时间通常不是一个严重的原因。)

换句话说,应该有充分的理由使数据类型可变,而不可变性应该是默认值。不幸的是,Java 不是支持这种方法的语言,相反,默认情况下一切都是可变的,需要一些努力才能让它与众不同。

关于java - 直接修改对象还是返回对象的修改克隆更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27334917/

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