好奇,我尝试了一下,看看它是否是方法中的有效代码:
{
// 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);
}
我确实可以。这对其他事情有用还是只是晦涩难懂?
此外,我读到限制对象的范围是确保它更快地被垃圾回收的好方法,因此在这方面可能这样做是有益的。这是对的吗?
声明匿名块本身并没有什么错误,因此您不必担心。有些人可能会对它有意见,遵循Java编码约定或其他或多或少具有美学性质的想法,但这是主观的,由您决定其有效性。我,就我而言,不会有这样的问题。
但是,它有助于垃圾回收是不正确的。在编译的字节码中,局部变量在块范围的末尾之外持续存在,并将保留其值,除非您明确清除它们以null
;该块仅影响 Java 源代码中的符号分配,并且不会转换为 JVM 看到的任何内容。
此外,可能值得注意的是,您还可以将这些类型的块用于控制流目的,如下所示:
foo: {
/* ... */
if(bar)
break foo;
/* ... */
}
遗憾的是,Java 不支持自定义循环逻辑的continue foo
:(。
如果您真的觉得需要,可以像这样限制范围,但编译器会简单地检测到您的变量在方法结束之前不会再次使用,并且如果方便,将重用其内存或寄存器位置。
关于你对 GC 的编辑,(1) int
不是 GCd,(2) 我敢打赌,一旦编译器检测到变量在其范围内的使用结束,它就会出于 GC 的目的将范围标记为结束,以及 (3) 如果您在单个函数中消耗了太多内存以致这成为一个问题, 你做错了。
除非有令人信服的理由明确限制这样的范围,而且我没有看到一个好的理由,否则我建议不要这样做。如果不出意外,它很少使用,因此可能会让其他程序员/后来的维护者感到困惑,如果他们(像你一样)以前没有见过它,或者他们不知道你为什么这样做。
在 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 循环以反映我所拥有的。