当对象作为参数传递时,我是否可以使其不可变,以便被调用的方法不能更改它,但被调用者可以更改它?
所以我有这样的东西:
Class Car {
Wheel wheel_1;
Axis axis = new Axis(wheel_1);
}
Class Wheel {
int size;
setSize(int size) {}
int getSize() {}
}现在我造了一辆有轮子的车。然后在car类中,我想构造一个轴。
为此,我将wheel_1传递给Axis的构造函数。
现在我的问题是:我能保证Axis的构造函数不会改变wheel_1的大小,但是car类可以改变它吗?
发布于 2013-04-19 17:37:46
是。通常,这是通过对Wheel类使用copy-constructor来完成的。
例如:
wheel_1 = new Wheel(wheel);请记住,Wheel类需要以支持这一点的方式编写。也就是说,它应该提供一个复制构造函数。
注意:这并没有使对象成为不可变的。它只是生成了一个副本,不能被您的类以外的任何东西编辑。
如果您从任何其他方法返回Wheel实例,请确保在退出的过程中也以防御性方式复制它:
Wheel getWheel() {
return new Wheel(wheel_1);
}最后,值得一提的是,只要有可能,创建不可变的类总是一个好主意。所以也许你可以通过让Wheel变得不可变来避免这个问题?
发布于 2013-04-19 17:47:39
使Wheel类不可变。然后,在需要新大小时让Car对象创建一个新的Wheel对象。
public final class Wheel {
private final int size;
public Wheel(int size) {
this.size = size;
}
public int getSize() {
return size;
}
}现在,您可以将轮子对象传递给Axis,而不会出现任何问题。
public class Car {
private Wheel wheel;
private Axis axis;
public Car(int initialWheelSize) {
wheel = new Wheel(initialWheelSize);
axis = new Axis(wheel);
}
}发布于 2013-04-19 17:38:16
将wheel_1的副本传递给Axis构造函数。
class Car {
Wheel wheel_1;
Axis axis = new Axis(new Wheel(wheel_1));
}此外,Wheel还需要一个构造函数,该构造函数接受另一个Wheel对象并复制其属性。
https://stackoverflow.com/questions/16101577
复制相似问题