Java作用域内的嵌套作用域

3
我经常看到像这样的代码,其中开发人员在一个作用域内创建了另一个作用域。

enter image description here

我能想到几个原因:
1. 隐藏封装作用域的变量,使它们被隔离。(这也将允许声明相同名称的变量)
2. 允许在范围1中分配的内存在其关闭时进行垃圾回收。

然而,我认为以上任何一个原因都不足以做到这一点...

这样做的目的是什么?


2
你需要问作者。这就像他在编写两个独立的测试方法一样(这是可以理解的),然后决定忘记它,但没有删除括号。 - Kayaman
2
你能把代码放在问题里而不是作为截图吗? - Tunaki
4
假设你省略了这些括号。如果你在第一个区块分配了大量的内存,并在第二个区块进行了很长时间的计算,那么你会长时间占用第一个区块的内存(这将使点2足够做到这一点...)。 - ParkerHalo
4
不行。但是第一个范围内的东西将有资格被垃圾回收。 - Bathsheba
3
不,不能保证“它将释放该内存”。但可以保证可以进行垃圾回收。 - Seelenvirtuose
显示剩余11条评论
1个回答

1
根据Java语言规范所述,声明的作用域是程序中可以使用该声明实体的区域,只要它可见(§6.4.1)。换句话说,作用域仅调节源代码中名称的使用。它对运行时行为没有影响,因此不会影响垃圾回收。通常只有在您需要实现第一种建议时才使用,但有时会变得过于繁琐。就个人而言,在我编写的代码中可能只使用了一两次。
垃圾收集部分由类实例的终结定义。该章节讲述了可达性

可达对象是指任何可以从任何活动线程中访问的对象。

JVM无法收集这些对象。

JLS还提到:

可以设计优化程序转换,将可达对象数量减少到比那些天真地被认为是可达的的对象更少。例如,Java编译器或代码生成器可以选择将不再使用的变量或参数设置为null,以使该对象的存储可以更早地被回收。

这也在当Java对象仍在作用域内时,它是否可以完成最终处理?的答案中讨论。


谢谢,我会更加关注规格而不是瞎猜 :) - vach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接