【发布时间】:2014-12-06 18:23:46
【问题描述】:
问题是我无法从内部修改我正在编写的对象,因此我创建了一个我修改并返回的克隆。但是,在其他函数中,我直接修改调用该方法的对象。我希望,人们也建议,保持一致,这样用户就可以对返回的克隆做任何他们喜欢的事情,而无需修改实际对象。
我必须在某些函数中返回对象的修改克隆,因为没有办法绕过它(我知道)。除了标题中的问题之外,是否有一致的做事方式更好(即使是最轻微的更改也会让我返回克隆)或者如果我有不同的方式来响应同一个班级的用户是否可以?
[编辑] 这样做更好吗:
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());
}
}
}
【问题讨论】:
-
这其实是一个很重要的问题!不要投票关闭。这基本上是对象是否应该是可变的问题。
-
这完全取决于您要对下游对象做什么,以及您为使用这些对象所采用的约定。对于某些程序,这两种方法都可能更有效,而对另一些程序则错误。
-
我认为返回“newImage”并仍然操纵源真的很奇怪。我还认为假设调用像“fillWithColor”这样在对象上不返回任何内容的方法不会修改对象是非常糟糕的。
标签: java object clone immutability