【问题标题】:Should you create variables for a if statement?您应该为 if 语句创建变量吗?
【发布时间】:2015-07-26 15:08:42
【问题描述】:

我想知道,从技术上讲,最有效的方法是什么。

用什么编码会更聪明:

    if (args[0].toLowerCase().toString().equals("server")) {
        System.out.println("SERVER");
    }

或者:

    String host = args[0].toLowerCase();

    if (host.equals("server")) {
        System.out.println("SERVER");
    }

请记住,我知道这个变量是多余的。而且一个参数也可以包含一个数字,但我的问题不是这样。这只是一个例子。

何时应该为 if 语句创建变量?总是?它更安全吗?我不应该这样做,因为我在浪费记忆吗?它会影响性能吗?

【问题讨论】:

  • “更安全”是什么意思?
  • 我会说,你创建一个变量(在这种情况下)是你需要再次使用它。否则内联会更容易。
  • 如果您多次使用它,请创建一个变量,否则请执行任何更具可读性的操作。
  • @ChiefTwoPencils 不,没关系。我明白了。

标签: java performance if-statement memory-efficient


【解决方案1】:

无论如何,创建变量。像这样的单个变量永远不会成为性能瓶颈,永远不会。

始终支持可读性。性能问题通常只出现在系统的特定部分。当它们出现时,而不是在测量那些(也就是有数字)之前,你会逐个处理它们。永远不要忘记:Premature optimization is the root of all evil.

在您的具体情况下,您可以更进一步并创建另一个变量,解释比较的意图:

String host = args[0].toLowerCase();
boolean isRunningUnderProduction = host.equals("server");
if (isRunningUnderProduction) {
    System.out.println("SERVER");
}

比评论好多了。并一目了然地解释了代码的意图。


引用Martin Fowler's Refactoring书:

关于性能的有趣之处在于,如果您分析大多数 程序,您会发现他们将大部分时间浪费在 部分代码。如果你平等地优化所有代码,你最终会 浪费了 90% 的优化,因为你是 优化运行不多的代码。制作程序所花费的时间 很快,因为不清楚而浪费的时间,都是浪费时间。

换句话说:如果你的程序更容易阅读,它们更容易修复慢的部分,当时间到来时(如果它来了)。

【讨论】:

    【解决方案2】:

    这对内存的影响可以忽略不计,风格和可读性更重要。

    我使用的规则是不要为此创建变量,除非将其全部嵌套在 if 语句中会变得不可读,或者如果我打算稍后再次使用它(可能在 if 语句中)。我发现单次使用的变量让我认为它可能会在以后使用并尽量避免它们。

    【讨论】:

    • 内存影响不可能为零,因为编译器无论如何都会内联它。
    • 希望是的,尽管很难 100% 相信像这样的“幕后”编译器优化。我怀疑编译器总是能解决这个问题,主要是可能,但总是?不过,也许我的怀疑是没有根据的。
    【解决方案3】:

    如果编译器很聪明,他不会太在意你把它放在一行或分开它。

    此代码具有其结构,因为它易于人类阅读。

    更重要的部分是可读性以及代码的“干净”程度,假设您有更多的 if:

    public void doSomething(){
    if (args[0].toLowerCase().toString().equals("server")) {
            System.out.println("SERVER");
        }
    }
    
    public void doSomethingElse(){
    if (args[0].toLowerCase().toString().equals("server")) {
            System.out.println("SERVER");
        }
    
    (...)
    
    public void doEvenMoreStuff(){
    if (args[0].toLowerCase().toString().equals("server")) {
            System.out.println("SERVER");
        }
    }
    

    ifs 都是一样的,但是如果你必须改变一些东西怎么办?也许是字符串"server",您必须检查整个代码并更改每一个出现的地方 - 并确保找到它们中的每一个! 所以更容易有变量,改变一些东西 -> 你只需在一个地方改变东西:

    String objectToSearchFor = "server";
    String output = "Server found";
    
    if (args[0].toLowerCase().toString().equals(objectToSearchFor)) {
            System.out.println(output);
        }
    }
    
    (...)
    
    public void doEvenMoreStuff(){
    if (args[0].toLowerCase().toString().equals(objectToSearchFor)) {
            System.out.println(output);
        }
    }
    

    这样维护起来更安全,并且有助于发现错误,因为它也更易于阅读。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-11
      • 2017-05-14
      • 1970-01-01
      • 2012-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多