1

出于好奇,我试了一下,看看它是否是方法中的有效代码:

{
    // code
}

它是!它所做的只是限制范围:

{
    int i = 1;
}

i = 2; // error

这很好,例如当我需要做一些结构上看起来像这样的事情时:

int i = 0;
for (; i < number; i++) {...}

doSomethingWithTheCount(i);

但我想限制以下范围i

{
    int i = 0;
    for (; i < number; i++) {...}

    doSomethingWithTheCount(i);
}

我确实可以。这对其他任何东西有用还是只是晦涩难懂?

此外,我已经读过限制对象的范围是确保尽快将其进行垃圾收集的好方法,因此在这方面可能这样做是有益的。那是对的吗?

4

3 回答 3

1

如果你真的觉得有必要,你可以像这样限制范围,但是编译器会在方法结束之前检测到你的变量不会再次被使用,如果方便的话,会重用它的内存或寄存器位置。

关于您对 GC 的编辑,(1)ints 不是 GCd,(2)我敢打赌,一旦编译器检测到变量在其范围内的使用结束,它会将范围标记为 GC 的目的,以及(3 ) 如果你在一个函数中消耗了太多内存以至于这成为一个问题,那么你做错了。

除非有令人信服的理由明确限制这样的范围,而且我看不到一个好的理由,否则我建议不要这样做。如果不出意外,它很少使用,因此可能会使其他程序员/后来的维护者感到困惑,如果他们(像你一样)以前没有见过它,或者如果他们无法弄清楚你为什么这样做。

于 2013-11-01T04:42:28.807 回答
1

声明匿名块并没有本质上的错误,因此您不必为此担心。有些人可能会根据 Java 编码约定或其他或多或少审美性质的想法对它有意见,但这是主观的,由您决定其有效性。就我而言,我不会有这样的问题。

但是,它有助于垃圾收集是不正确的。在编译的字节码中,局部变量在块范围的末尾持续存在,并且将保留它们的值,除非您将它们明确清除为null; 该块仅影响 Java 源代码中的符号分配,并且不会转换为 JVM 看到的任何内容。

此外,值得注意的是,您还可以将这些类型的块用于控制流目的,如下所示:

foo: {
    /* ... */
    if(bar)
        break foo;
    /* ... */
}

不幸的是,Java 不支持continue foo自定义循环逻辑。:(

于 2013-11-01T04:42:34.677 回答
0

在 Java(与 C 不同)中,如果您担心范围,则可以在 for 循环中声明变量。

例如:

for (int i = 0; i < number; i++) {
    //Do Something
}

对于 while 循环,如果您担心变量超出方法范围,您可以随时将其更改为 Do-While。

例子:

do {
    int i = 0;
    //Do Something

    i++;
} while (i < number);

评论:我看不出为什么你不能/不应该做你所拥有的。就个人而言,我会以相同的方法执行 while 循环,但会更改 for 循环以反映我所拥有的。

于 2013-11-01T04:36:39.237 回答