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

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


因为只使用parse()作为BracketMatcher中的静态方法,会更好吗?

谢谢。

最佳答案

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

声明变量的位置本身不会对性能产生影响。

就我个人而言,我将创建一次Scanner(因为它应该读取所​​有行,而不仅仅是一行),但是要在循环内部创建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));
    }
}



  因为只使用parse()作为BracketMatcher中的静态方法,会更好吗?


我不知道您的BracketMatcher会做什么,并且无论输入如何,是否都可以准备。例如,正则表达式匹配器可以为固定表达式编译一次,然后重新用于许多字符串进行匹配。在这种情况下,您可以将BracketMatcher保留为有状态对象,并在循环外创建它。

07-24 15:28