算术中的对象值和局部值

时间:2014-05-21 19:54:32

标签: java

所以我试图对其中的值和对象' 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;

3 个答案:

答案 0 :(得分:2)

让我们简化代码,以便更容易阅读:

foo.setX(foo.getX() + foo.getY());
foo.setY(foo.getX() + foo.getY());

现在假设我们从foo.X = 10foo.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);
}