【发布时间】:2012-02-17 14:24:09
【问题描述】:
我刚刚遇到以下情况。
if ( test ) {
{
// statements 1
}
{
// statements 2
}
}
这是我第一次看到这个。它是如何工作的?
【问题讨论】:
标签: java
我刚刚遇到以下情况。
if ( test ) {
{
// statements 1
}
{
// statements 2
}
}
这是我第一次看到这个。它是如何工作的?
【问题讨论】:
标签: java
这只是为了隐藏局部变量而编写两个不同的代码块。
来自问题“Anonymous code blocks in Java”的回答:
块限制变量范围。
public void foo() { { int i = 10; } System.out.println(i); // Won't compile. }不过,在实践中,如果您发现自己使用了这样的代码块,那么 这可能表明您想将该块重构为 方法。
【讨论】:
这可以(稍微)有用的两个示例 - 在单元测试和 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;
}
...您最终可能会使用多种方法,每种方法处理不同的参数变化,并且每种方法可能只使用两次。
【讨论】:
这两个块是独立的。因此,您在第一个块中可能拥有的任何变量都无法在第二个块中访问 - 或在第一个块之外的任何地方。它被称为代码隔离或作用域。
【讨论】:
{} 引入了一个作用域,在该作用域内声明的变量只存在于该作用域。例如:
if ( test ) {
int i = 0;
float i = 0;
}
将无法编译,因为 i 已在同一范围内声明了两次。
if ( test ) {
{
int i = 0;
}
{
float i = 0;
}
}
可以正常编译,因为 i 没有在同一范围内声明两次。
【讨论】:
什么都没有。他们声明代码块。通常你不会使用它们。唯一的区别是,如果您在第一个变量中声明了一个变量 - 在第二个变量中将无法访问它。
【讨论】:
这两个块是顺序执行的。每个块都为局部变量定义了一个新的范围。所以你可以有
int i;
在两个区块中。
【讨论】:
那些是匿名块。它们用于限制范围。不仅在 java 中,在 C# 和 C 等其他语言中也是如此。
【讨论】: