Dan*_*ski 6 java language-features
我有这个代码
private static Set<String> myField;
static {
myField = new HashSet<String>();
myField.add("test");
}
Run Code Online (Sandbox Code Playgroud)
它的工作原理.但是当我翻转订单时,我收到了非法的前向引用错误.
static {
myField = new HashSet<String>();
myField.add("test"); // illegal forward reference
}
private static Set<String> myField;
Run Code Online (Sandbox Code Playgroud)
我有点震惊,我没想到Java这样的东西.:)
这里发生了什么?为什么声明的顺序很重要?为什么分配工作而不是方法调用?
dfa*_*dfa 10
首先,让我们讨论一下"前向参考"是什么以及为什么它是坏的.前向引用是对尚未初始化的变量的引用,并且它不仅限于静态初始化器.这些都很糟糕,因为如果允许的话,它们会给我们带来意想不到的结果.看看这段代码:
public class ForwardRef {
int a = b; // <--- Illegal forward reference
int b = 10;
}
Run Code Online (Sandbox Code Playgroud)
这个类初始化时应该是什么?初始化类时,将按照从第一个到最后一个遇到的顺序执行初始化.因此,你期待这条线
a = b;
Run Code Online (Sandbox Code Playgroud)
在以下之前执行:
b = 10;
Run Code Online (Sandbox Code Playgroud)
为了避免这种问题,Java设计者完全不允许使用前向引用.
编辑
此行为由Java语言规范的第8.3.2.3节指定:
只有当成员是类或接口C的实例(分别是静态)字段并且满足以下所有条件时,才需要在成员声明之前显示该成员的声明:
用法发生在C的实例(分别是静态)变量初始化器或C的实例(分别是静态)初始化器中.
用法不在作业的左侧.
C是封闭用法的最内层类或接口.
如果不满足上述三个要求中的任何一个,则会发生编译时错误.
| 归档时间: |
|
| 查看次数: |
296 次 |
| 最近记录: |