【问题标题】:Inline braces block within method and loop [duplicate]方法和循环内的内联大括号阻塞[重复]
【发布时间】:2013-04-24 14:34:34
【问题描述】:

很难准确地搜索到这个。我在几个地方看到过这个,我什至在代码中尝试过,看看它是如何工作的,但只是为了让我确切地知道它们是如何使用的,并确保我不会滥用它们,我想我会问在这里。

 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...
           }
           .
           .
           .
      }
 }
  • 谁能解释一下这些大括号的用途?
  • 我假设它们像方法一样工作,并且只要没有在块之外指定任何内容,它们就会限制其范围,但是还有其他用途吗?
  • 它们的确切名称是什么?

提前致谢

【问题讨论】:

标签: java inline braces


【解决方案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
}

在这种情况下,i 被定义在更大的范围空间(封闭方法或构造函数的空间)中,for 循环只是增加它的值。因此,您在两个不同的范围内共享一个变量。

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

【讨论】:

  • 谢谢。 +1 的帮助和努力。但是正在寻找在循环中使用它们,而不是在循环本身。我已经决定将它们用于方法和循环中的范围。
  • 斯克皮,很高兴为您提供帮助。我的回答也与它们在 for 循环中的使用有关。您可以在 for 循环中定义额外的范围区域,就像在方法或构造函数中一样。
【解决方案2】:

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

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

但是如果代码如下

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

  {
      System.out.println(str);
  }

第二次打印会报编译错误,因为str的作用域在第一个作用域。

【讨论】:

  • 所以在一个循环中它们不仅会运行一次,而且会在每次重复时限制块的范围?
  • 是的。它的作用域在循环中,所以它会在每个循环上运行。
【解决方案3】:

所以发现了一些我认为我会在这里为任何人发布的东西,因为其他问题似乎都没有完全澄清这一点。

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

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

      public doSomeThingSpecial() {}

      public doSomethingSpecial(String specialString) { }

      public doSomethingSpecial(int specialNumber) { }
 }

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

所以每次调用构造函数时都会调用内联花括号。

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

“不过,在实践中,如果你发现自己使用这样一个代码块,这可能表明你想将该块重构为一个方法” - 感谢 Robert Munteanu Top Answer: Anonymous code blocks in Java

这基本上是我到目前为止所想到的一切

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 2017-09-10
    • 2013-03-09
    相关资源
    最近更新 更多