0

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

字符串tempUserName = input.getUserName();
tempUserName = sanitzie(tempUserName);
验证(临时用户名);
// ... 使用 tempUserName 执行其他操作

字符串tempUserNickName = input.getUserNickName();
tempUserNickName = sanitzie(tempUserNickName);
验证(临时用户昵称);
// ... 使用 tempUserNickName 执行其他操作

...
...

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

字符串temp = input.getUserName();
温度=消毒(温度);
验证(临时);
// ... 用 temp 做其他事情

temp = input.getUserNickName();
温度=消毒(温度);
验证(临时);
// ... 用 temp 做其他事情

...
...

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

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

  1. 内存消耗角度
  2. 绩效观点
  3. 任何其他观点

让我们将问题的范围String仅限于变量 - 但我很乐意获得更一般的反馈。

4

5 回答 5

2

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

于 2012-05-29T10:03:58.080 回答
2

我也不喜欢重用局部变量,性能方面在这里应该不重要,因为你会获得或失去如此微小的时间,以至于它可以忽略不计。无论如何,JIT 都可以为两者生成相同的本机代码。

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

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

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

于 2012-05-29T10:05:04.473 回答
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());

... wherehandleInput可能会返回null无效或危险的输入等。您可能需要进行handleInput比上述更多的参数化。

回答您提出的观点:

内存消耗角度

我想从技术上讲,如果只有一个临时变量,那么早先的内存将有资格更早地进行垃圾收集(例如,方法运行时而不是之后)。但我怀疑它会对现实世界产生任何影响。

绩效观点

我无法想象这样。

任何其他观点

我们可能在这里归结为风格,这主要是个人喜好问题。同样,我将它拆分为一个函数,这是围绕这个问题的一种终结。:-)

于 2012-05-29T10:05:01.930 回答
0

考虑到性能差异(内存方面)很小。

更重要的是让你的代码可读,并优化重要的东西。

于 2012-05-29T10:07:18.277 回答
0

尽管它们不是很好的风格,但仍会出现这些重复。我经常这样做:

{
    String s = ...
    something with s;
}
{
    String s = ...
    something with s;
}
于 2012-05-29T10:10:31.533 回答