Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 两个连续的代码块{}{}做什么?_Java - Fatal编程技术网

Java 两个连续的代码块{}{}做什么?

Java 两个连续的代码块{}{}做什么?,java,Java,可能重复: 我只是遇到了以下情况 if ( test ) { { // statements 1 } { // statements 2 } } 这是我第一次看到这个。它是如何工作的?没什么。它们声明代码块。通常你不会用它们。唯一的区别是,如果您在第一个块中声明了一个变量,那么在第二个块中将无法访问它。这两个块是独立的。因此,无论第一个块中有什么变量,都无法在第二个块中或第一个块之外的任何地方访问。这称为代码隔离或作用域。这两个

可能重复:

我只是遇到了以下情况

if ( test ) {
    {
        // statements 1
    }
    {
        // statements 2
    }
}

这是我第一次看到这个。它是如何工作的?

没什么。它们声明代码块。通常你不会用它们。唯一的区别是,如果您在第一个块中声明了一个变量,那么在第二个块中将无法访问它。

这两个块是独立的。因此,无论第一个块中有什么变量,都无法在第二个块中或第一个块之外的任何地方访问。这称为代码隔离或作用域。

这两个块按顺序执行。每个块为局部变量定义一个新范围。所以你本来可以

 int i;

在两个块中。

它只是编写两个不同的代码块以隐藏局部变量

从对问题“”的回答来看:

块限制变量范围

public void foo()
{
    {
        int i = 10;
    }
    System.out.println(i); // Won't compile.
}
然而,在实践中,如果您发现自己正在使用这样的代码块,那么 这可能是一个迹象,表明您希望将该块重构为 方法


{}
引入一个作用域,并且在该作用域中声明的变量仅存在于该作用域中。例如:

if ( test ) {

    int i = 0;


    float i = 0;
}
将无法编译,因为在同一范围内已声明了两次
i

if ( test ) {
    {
        int i = 0;
    }

    {    
        float i = 0;
    }
}

可以编译,因为
i
没有在同一范围内声明过两次。

这可能(稍微)有用的两个示例—单元测试和GUI,这两个示例通常都涉及重复代码:

if ( test ) {
    {
        int i = 0;
    }

    {    
        float i = 0;
    }
}
它在GUI构建中非常有用,在GUI构建中,剪切和粘贴与一个组件相关的行非常容易,而忘记为新组件更新这些行,从而导致难以发现的错误,例如:

    JButton button1 = new JButton("OK");
    button1.setEnabled(false);
    button1.setAlignmentX(-1);

    JButton button2 = new JButton("Apply");
    button1.setEnabled(false);
    button1.setAlignmentX(-1);
哎呀,我刚刚配置了两次
按钮1
。如果您将每个按钮放在它自己的块中,那么编译器就会发现这个错误。同样,您可以用单独的方法创建每个按钮,但这可能会使您很难看到发生了什么(特别是考虑到Java中缺少关键字参数):


…您可能会得到许多方法,每个方法处理不同的参数变化,每个方法可能只使用两次。

这些是匿名块。它们用于限制范围。不仅是java语言,还有其他语言,如C#和C。

别开玩笑了。这是在学术环境或认证测试中出现的“整洁Java技巧”之一,但专业Java开发人员可能永远不会使用它。在少数情况下,它确实非常有用,可以确保相邻的代码块实际上是独立的,以避免剪切和粘贴错误,当然,你可以用它做一些骇客的事情,但我不认为它适合任何你在第一次设计应用程序时有意开始的设计模式。正如萨潘所说。。。如果你在代码中看到这一点,这是一个很好的迹象,表明是时候重构和清理slop了。属于一起的行被放在一个块中。将其分解为多个方法是过分的,会降低可读性。在我的例子中,这只是一个可读性的问题。有人谁不喜欢使用这个解释为什么?仅仅想明确一个变量的作用域并强制编译器执行,并不强烈主张将流分解成另一个方法。除了“我觉得它很有趣”之外,我毫无理由地读了很多“blecch”。像这样的虫子很烦人。可以看到大括号在这里暂时有用。在重构和整理过程中也很有用,但通常最好在最终代码中删除。如果您希望引起争议并在块内继续或中断,它们也可能有用。如果您正在生成代码,并且不希望在特定脚本中包含同一节点两次时意外声明变量两次,那么它们也很有用。我们的测试自动化团队遇到了类似的错误。对于这种情况,使用构建器可能是更好的解决方案-它将为您提供更好的可读性,并消除您试图防止的错误类别,