【问题标题】:Is there a benefit in using a single temp variable in a method? [closed]在方法中使用单个临时变量有好处吗? [关闭]
【发布时间】:2012-06-03 13:01:15
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

  • 在更大的计划中可能根本不重要。我怀疑您或其他任何人都可以生成数据来证明任何一种方式。使用读得最好、最清楚的那个。不幸的是,这可能是一个主观决定。不是每个人都会按照你的方式行事。

标签: java performance memory temp


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢 - 代码只是一个示例 - 在现实生活中逻辑并不相同 - 所以提取一个方法可能不值得 - 但这里提供的所有答案基本上都说同样的话 - 可维护性这种情况是主要因素 - 其余的似乎可以忽略不计。我想知道如果我对C++ 提出同样的要求,这些答案是否会改变。
【解决方案2】:

这些重复虽然不是很好的风格。我经常这样做:

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

【讨论】:

  • 我相信代码会变得更加混乱......
  • @AndreiCiobanu 是的,对于最终的生产代码,我也从未保留过这种写作。显然重复的代码太笨拙了,需要一种重写。
【解决方案3】:

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

更重要的是让您的代码具有可读性,并在重要的地方进行优化。

【讨论】:

    【解决方案4】:

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

    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 进行更多参数化。

    回答你提出的观点:

    内存消耗角度

    我想在技术上,如果只有一个临时变量,那么早先的内存将有资格更早地进行垃圾回收(例如,该方法正在运行而不是比之后)。但我怀疑这对现实世界有什么影响。

    绩效视角

    我无法想象。

    其他视角

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多