你应该为if语句创建变量吗?

时间:2015-05-14 20:34:24

标签: java performance if-statement memory-efficient

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

使用以下代码更聪明:

    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语句创建变量?总是?它更安全吗?我不应该这样做,因为我在浪费记忆吗?它会影响性能吗?

3 个答案:

答案 0 :(得分:10)

一定要创建变量。像这样的单个变量永远不会成为性能瓶颈,永远不会。

始终支持可读性。性能问题通常只出现在系统的特定部分。当它们出现时,而不是在测量它们(也就是有数字)之前,你会逐个对待它们。永远不要忘记: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%的优化浪费了,因为你是   优化运行不多的代码。制作该计划所花费的时间   很快,因为缺乏清晰度而浪费的时间,都是浪费时间。

换句话说:如果您的程序更容易阅读,那么当时机成熟时,它们就更容易修复缓慢的部分(如果它来了)。

答案 1 :(得分:5)

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

我使用的规则是不为它创建一个变量,除非它将它全部嵌套在if语句中,或者我打算稍后再次使用它(可能在if语句中),这样做是不可读的。我发现单个使用变量让我觉得它可能会在以后使用并试图避免使用它们。

答案 2 :(得分:0)

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

这段代码的结构是因为它易于人类阅读。

更重要的部分是可读性以及如何清洁"代码是,想象你有更多的ifs:

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);
    }
}

维护起来更安全,并且有助于查找错误,因为它也更容易阅读。