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

sjb*_*lli 4 java clone object immutability

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

我必须在某些函数中返回对象的修改克隆,因为没有办法绕过它(据我所知)。除了标题中的问题之外,是否最好采用一致的做事方式(即使是最轻微的变化,我也会返回克隆),或者如果我在同一类中采用不同的方式来响应用户,是否可以?

[编辑]这样做是否更好:

 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;
}
Run Code Online (Sandbox Code Playgroud)

或这个:

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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Ing*_*ngo 5

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

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

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

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

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

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