在方法中使用单个临时变量有什么好处?

时间:2012-05-29 09:59:29

标签: java performance memory temp

通常在代码中我得到的场景我需要一个临时变量 - 例如:

String tempUserName = input.getUserName();
tempUserName = sanitzie(tempUserName);
validate(tempUserName);
// ... Do something else with tempUserName

String tempUserNickName = input.getUserNickName();
tempUserNickName = sanitzie(tempUserNickName);
validate(tempUserNickName);
// ... Do something else with tempUserNickName

...
...

我知道有些人使用单个临时变量来做这些事情:

String temp = input.getUserName();
temp = sanitzie(temp);
validate(temp);
// ... Do something else with temp

temp = input.getUserNickName();
temp = sanitzie(temp);
validate(temp);
// ... Do something else with temp

...
...

在我看来 - 我写它的方式更清晰,更不容易出错。

我的问题是 - 使用单个临时变量有什么好处:

  1. 内存消耗视角
  2. 绩效观点
  3. 任何其他观点
  4. 让我们将问题的范围仅限于String个变量 - 但我很乐意获得更一般的反馈。

5 个答案:

答案 0 :(得分:2)

内存消耗和性能无关紧要,但每个非final的var都会使代码更难阅读。你永远不能一眼就看出它被重新分配的确切位置,如果你正在寻找一个bug,这会给你带来困难。我的建议,以及我在代码中经常做的是提取到一个方法,所以你甚至不需要调用端的本地var。总是倾向于根据函数组合编写代码。

答案 1 :(得分:2)

我也不想重复使用局部变量,而且性能方面在这里并不重要,因为你可以获得或失去这么微小的时间,它可以忽略不计。无论如何,JIT可以为两者生成相同的本机代码。

重要的是可读性和可维护性。我在你的代码中看到的是应该有一个额外的方法,以便你的原始代码成为:

sanitizeAndValidate(input.getUserName());
sanitizeAndValidate(input.getUserNickName());

这使代码更清晰,更可测试,避免重复,并使您的初始问题无关紧要,因为您的临时变量仅在sanitizeAndValidate()方法中定义一次。

答案 2 :(得分:1)

我对此的主要答案是,如果您有一系列这类陈述,我会将分组分解为您调用的单独函数。 (这只有一个临时变量。)例如:

private String handleInput(String val) {
    val = sanitzie(val);
    validate(val);
    // ... Do something else with val

    return val;
}

用法:

String finalPlaceForUserName     = handleInput(input.getUserName());
String finalPlaceForUserNickName = handleInput(input.getUserNickName());

...其中handleInput可能会因无效或危险的输入而返回null等。您可能需要更多地handleInput参数化。

回答你提出的观点:

  

内存消费视角

我认为技术上,如果只有一个临时变量,之前的内存将有资格进行垃圾收集(例如,方法正在运行而不是之后)。但我怀疑这会产生任何现实世界的差异。

  

绩效观点

我无法想象。

  

任何其他观点

我们可能会在这里找到风格,这主要取决于个人喜好。再一次,我将它拆分成一个函数,这是一个围绕这个问题的终结。 : - )

答案 3 :(得分:0)

考虑到性能差异(记忆明智)要小。

更重要的是让您的代码可读,并在重要的地方优化。

答案 4 :(得分:0)

虽然这些重复不是很好的风格,但仍会发生。我经常这样做:

{
    String s = ...
    something with s;
}
{
    String s = ...
    something with s;
}