Java循环对象声明的最佳实践

时间:2014-05-23 02:54:44

标签: java loops object declaration

我已经阅读了一些关于在循环内声明对象的其他问题,例如:

Is it Better practice to Declare individual objects or loop Anonymous objects into ArrayList?

Java : declaring objects in a loop

但两个都没有真正解决我的问题。

我正在重复扫描用户输入并创建一个类来解析每次迭代时的字符串:

    public static void main(String[] args) {
        while (true) {
            System.out.print("Enter a string of brackets to test: ");
            String exp = new Scanner(System.in).nextLine().trim();
            if (exp.equals("q")) break; // q is the 'quit' flag
            System.out.println(new BracketMatcher(exp.length()).parse(exp));
        }
    }

效果,而不是范围 - 对此块有什么区别吗?:

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    BracketMatcher matcher;
    while (true) {
        System.out.print("Enter a string of brackets to test: ");
        String exp = input.nextLine().trim();
        if (exp.equals("q")) break; // q is the 'quit' flag
        matcher = new BracketMatcher(exp.length());
        System.out.println(matcher.parse(exp));
    }

我最好不要在BracketMatcher中使用parse()作为静态方法,因为我只使用该方法吗?

感谢。

3 个答案:

答案 0 :(得分:2)

代码中的性能差异来自于在每次迭代中创建一个新的扫描仪(这很愚蠢,甚至可能无法可靠地运行,具体取决于扫描仪的缓冲方式)。

声明变量本身没有性能影响。

就个人而言,我会创建一次扫描器(因为它应该读取所​​有行,而不仅仅是一行),但是循环内部的BracketMatcher(因为它与当前行绑定)。

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    while (true) {
        System.out.print("Enter a string of brackets to test: ");
        String exp = input.nextLine().trim();
        if (exp.equals("q")) break; // q is the 'quit' flag
        System.out.println(new BracketMatcher(exp.length()).parse(exp));
    }
}
  

我最好不要在BracketMatcher中使用parse()作为静态方法,因为我只使用该方法吗?

我不知道你的BracketMatcher做了什么,以及是否可以准备任何东西而不管输入。例如,可以为固定表达式编译一次正则表达式匹配器,然后重复使用许多字符串进行匹配。在这种情况下,您可以将BracketMatcher保留为有状态对象,并在循环外创建一次。

答案 1 :(得分:0)

执行分配new Scanner(...)通常会比重新使用对象更少执行。特别是如果对象本身没有涉及内部状态 - 那么每次分配一个新状态对你没有任何帮助。

所以是的,我会说每个都做一个并重新使用它们。

  

在BracketMatcher中使parse()成为静态方法会更好吗?   既然我只使用那种方法?

如果BracketMatcher不包含任何状态,则可以将其设为静态方法。

答案 2 :(得分:0)

如果你多次创建扫描仪会导致性能下降(因为垃圾收集和构建它),并且由于垃圾邮件输入扫描程序而导致系统略显笨拙