两个连续的代码块{} {}有什么作用?

时间:2012-02-17 14:24:09

标签: java

  

可能重复:
  Anonymous code blocks in Java

我刚刚遇到以下情况。

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

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

7 个答案:

答案 0 :(得分:53)

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

从问题“Anonymous code blocks in Java”的回答:

  

阻止限制变量范围。

public void foo()
{
    {
        int i = 10;
    }
    System.out.println(i); // Won't compile.
}
     

但实际上,如果您发现自己使用了这样的代码块   这可能是你想要将那个块重构为a的一个标志   方法

答案 1 :(得分:21)

这可以(稍微)有用的两个例子 - 在单元测试和GUI中,这两个例子通常都涉及重复的代码:

它在GUI构建中非常有用,它可以非常容易地剪切和粘贴与一个组件相关的行,并且忘记为新组件更新它们,从而导致难以发现的错误,例如:

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

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

糟糕,我刚刚配置了button1两次。如果将每个按钮放在它自己的块中,则编译器会选择此错误。同样,你可以在一个单独的方法中创建每个按钮,但这可能使得很难看到发生了什么(特别是考虑到Java中缺少关键字参数):

JButton button_ok = makeButton("OK", false, -1);
JButton button_apply = makeButton("Apply", true, 1);
// what exactly is being set here?

...

// much later:
private static JButton makeButton(String name, boolean enabled,
        int alignment)
{
    JButton button = new JButton(name);
    button.setEnabled(enabled);
    button.setAlignmentX(alignment);
    return button;
}

...你可能会得到许多方法,每种方法都处理不同的参数变化,每种方法只能使用两次。

答案 2 :(得分:10)

这两个街区是独立的。因此,您在第一个块中可能具有的任何变量将无法在第二个块中访问 - 或者在第一个块之外的任何位置。它被称为代码隔离范围

答案 3 :(得分:7)

{}引入了范围,并且范围内声明的变量仅存在于该范围内。例如:

if ( test ) {

    int i = 0;


    float i = 0;
}

将无法编译,因为i已在同一范围内声明了两次。

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

    {    
        float i = 0;
    }
}

编译正常,因为i尚未在同一范围内声明两次。

答案 4 :(得分:6)

无。他们声明了代码块。通常你不会使用它们。唯一的区别是如果你在第一个中声明一个变量 - 它将无法在第二个变量中访问。

答案 5 :(得分:4)

顺序执行这两个块。每个块定义局部变量的新范围。你可以拥有

 int i;

两个街区。

答案 6 :(得分:4)

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