内联大括号在方法和循环中阻塞

时间:2013-04-24 14:34:34

标签: java inline braces

要精确搜索这个很难。我已经在一些地方看过这个,我甚至在代码中尝试过它,看看它是如何工作的,但这样我才知道它们是如何被使用的,并确保我不会滥用它们我想我会问在这里。

 public void doSomethingSpecial()
 {

      String strHello = null;

      // What is the following section in braces for
      {
           strHello = "Hello World"
      }

      for(int i = 0; i < 10; i++)
      {

           //  What is the significance of them it in a loop?
           {
                strHello = "Hello";
                // Do something else...
           }
           .
           .
           .
      }
 }
  • 有人可以澄清这些支撑块支架的用途吗?
  • 我认为它们就像一个方法一样工作,并且只要没有在块外指定它就会限制任何内容的范围,但是还有其他用途吗?
  • 他们的确切名称是什么?

提前致谢

3 个答案:

答案 0 :(得分:1)

大括号定义范围。例如,如果您在大括号内定义一个局部变量并为其赋值,如下所示:

{
int foo = 10;

}

然后foo的作用域(即定义并具有值的代码部分)仅限于大括号内的区域。

你的for循环也一样。在这些括号内,计数器i被定义并具有意义,但不在外面。所以这段代码不会编译:

for (int i = 0; i < 5; i++) {
  // Do something with i
}

i = 10; // Won't compile. i is undefined as a variable.

这样做的好处很多,因为您可以精确控制不同变量的范围。您还可以在异常处理的上下文中定义诸如异常等事物的范围。

您也可以这样做:

int i = 0;

for (; i < 5; i++) {
  // Do something with i.
}

for (; i < 10; i++) {
  // Do something else with i
}

在这种情况下,我在更大的范围空间(封闭方法或构造函数)中定义,而for循环只是递增其值。所以你在两个不同的范围区域内共享一个变量。

最后,您可以在方法或构造函数之外将它们用作类中的初始化块。它们允许您初始化成员变量,例如,无法使用单行代码轻松初始化。

答案 1 :(得分:1)

在类中,它们形成一个静态初始化程序,它在加载类时运行一次,这首先发生。

在方法中,它们标记范围。它们在您的代码中基本没用。

但如果代码如下

  {
      String str = "test";
      System.out.println(str);
  }

  {
      System.out.println(str);
  }

第二个打印将报告编译错误,因为str的范围在第一个范围内。

答案 2 :(得分:0)

所以找到了我认为我会在这里发布给任何人的东西,因为其他问题似乎都没有明确说明这一点。

在类范围内的方法之外使用时:

 public class doSomethingSPecial() {
      {
           System.out.println("This is a constructor");
      }

      public doSomeThingSpecial() {}

      public doSomethingSpecial(String specialString) { }

      public doSomethingSpecial(int specialNumber) { }
 }

“Java编译器将初始化程序块复制到每个构造函数中。因此,这种方法可用于在多个构造函数之间共享代码块。 - {{3 (感谢Soririous Delimanolis)

因此,每次调用构造函数时都会调用内联大括号。

关于在方法和循环中使用的其他问题,大括号似乎只是为了限制范围。

“但实际上,如果你发现自己使用这样的代码块,这可能表明你想要将该块重构为方法” - 感谢Robert Munteanu {{3} }

这基本上是我到目前为止所提出的所有内容