在Java中的方法中是否使用了自由浮动块?

我不知道方法可能有像这样的浮动块:

class X { public static void main( String [] args ) { { //<--- start int i; } //<-- ends } } 

我知道方法之外的浮动块,但从未尝试过它们。

这可能用于定义局部范围或其他内容。

在Java中的方法中是否有用于浮动块的用途?

有用吗?

是 – 限制局部变量的范围。

这是个好主意吗?

可能有争议(可能会)。

“亲”阵营会说缩小变量范围从不会受到伤害。 “con”阵营会说,如果你在一个方法中使用它并且你的方法足够长以保证将变量的范围缩小到特定的部分,那么它可能表明你应该从不同的部分中制作单独的方法。

就个人而言,我使用它们,例如:

 public void doGet( final HttpServletRequest request, final HttpServletResponse response) throws IOException { final PersistenceManager pm = PMF.get().getPersistenceManager(); final List toDoLists; { final Query query = pm.newQuery(ToDoListGaejdo.class); query.setOrdering("listName asc"); toDoLists = (List) query.execute(); } final List entries; { final Query query = pm.newQuery(ToDoItemGaejdo.class); query.setOrdering("listName asc, priority asc"); entries = (List) query.execute(); } final ServletOutputStream out = response.getOutputStream(); out.println(""); out.println(" Debug View"); .... 

你刚才给出了一个例子。 您可以声明比方法范围更“本地”。 当它超出范围时,方法的其余部分无法看到它。

从语法上讲,块可以出现在语句可以出现的任何地方。 这是块结构语言的基本原则。

是的,它们有两个用途。

首先,您可以使用此类块限制变量的范围。 这有助于代码的可读性,因为在确定变量的使用方式时,您需要考虑较小的区域。 另外,这可以最小化方法帧所需的“时隙”数量,从而节省堆栈空间。 我很惊讶地发现这种优化是必要的。

其次,当您将标签附加到块时,可以在块内使用目标break来跳转到块的末尾。 这并不像纯粹的goto声明那样邪恶,但瞄准仍会触发红旗和警告铃声。

块有用的另一种情况是在switch语句中; 例如,以下内容无效

  switch (i) { case 1: float j = ...; break; case 2: float j = ...; // compilation error break; ... } 

但添加块可以:

  switch (i) { case 1: { float j = ...; break; } case 2: { float j = ...; // just fine break; } ... } 

当您使用(大)switch语句实现状态机和解释器之类的东西时,就会出现这种用例。 你可以说局部变量应该都有不同的名称,但是:

  • 对于相同的概念(尽管在不同的范围内)使用相同的名称,这样的粗糙代码有利于大规模的可读性,并且
  • 使用块使编译器更容易识别在其中声明的变量可以共享堆栈帧槽。 如果封闭方法也是递归的,这可能是重要的。

(好吧,这都是微优化,或微优化的结果。但我们假设我们已经确定它是合理的。)