所以我试图对其中的值和对象' currentUser'进行简单的算术运算。在我的“定价行动”中类。
代码应添加两个音量值(双精度)并将变量的值设置为两者的总和。在此示例中,volume_2和volume_4变量应设置为两者之和。
方法1:
if(filled4 == true){
if(currentUser.getUtility_2().equalsIgnoreCase(currentUser.getUtility_4())){
currentUser.setVolume_2(currentUser.getVolume_2() + currentUser.getVolume_4());
currentUser.setVolume_4(currentUser.getVolume_2() + currentUser.getVolume_4());
}
}
方法2:
if(filled3 == true){
if(currentUser.getUtility_2().equalsIgnoreCase(currentUser.getUtility_3())){
holder = 0;
holder = currentUser.getVolume_2() + currentUser.getVolume_3();
currentUser.setVolume_2(holder);
currentUser.setVolume_3(holder);
}
}
方法2返回预期的值,方法1似乎折腾了它所设置的值的副本。
我的问题是为什么方法1会这样做?我只能假设它只是将额外的总和加到当前值上,但是setter方法是通用的this.x = x;
答案 0 :(得分:2)
让我们简化代码,以便更容易阅读:
foo.setX(foo.getX() + foo.getY());
foo.setY(foo.getX() + foo.getY());
现在假设我们从foo.X = 10
,foo.Y = 20
开始。
第一个语句最初将计算foo.X + foo.Y
- 即10 + 20或30。
然后,它将(30)设置为foo.X
的新值。
第二个语句最初会计算foo.X + foo.Y
,现在是30 + 20或50.请注意,这是使用新值foo.X
。然后,它将50设置为foo.Y
的新值。
如果要为两个属性设置相同的值,则应计算该值一次,以避免更改第一个属性的值影响计算。但是,将该值的局部变量声明为本地变量更为清晰:
double result = foo.getX() + foo.getY();
foo.setX(result);
foo.setY(result);
这不仅正确,而且更容易理解和更高效。奖金!
答案 1 :(得分:1)
因为在使用新值设置volume4之前已设置了volume2的值。
currentUser.setVolume_2(currentUser.getVolume_2() + currentUser.getVolume_4());
// volume2 now set with new value
// which you are about to use below
currentUser.setVolume_4(currentUser.getVolume_2() + currentUser.getVolume_4());
答案 2 :(得分:1)
你的代码正在执行两个添加(我怀疑你想要一个) -
if(currentUser.getUtility_2().equalsIgnoreCase(currentUser.getUtility_4())){
// Changes volume 2
currentUser.setVolume_2(currentUser.getVolume_2() + currentUser.getVolume_4());
currentUser.setVolume_4(currentUser.getVolume_2() + currentUser.getVolume_4());
}
应该是
if(currentUser.getUtility_2().equalsIgnoreCase(currentUser.getUtility_4())){
int newVolume = currentUser.getVolume_2() + currentUser.getVolume_4();
currentUser.setVolume_2(newVolume);
currentUser.setVolume_4(newVolume);
}