gpt4 book ai didi

java - 分配给同名的静态最终字段

转载 作者:搜寻专家 更新时间:2023-10-31 19:54:50 25 4
gpt4 key购买 nike

为了区分实例字段和同名的局部变量,我们可以使用前缀 this. 来限定对字段的访问:

class Test {
public final Foo x;

public Test(Foo x) {
this.x = x;
}
}

我试图通过使用类名限定访问权限在静态上下文中做同样的事情:

import java.util.*;

class Test {
public static final Map<String,Object> map;

static {
Map<String,Object> map = new HashMap<>();

// ...
// assume I fill the map with useful data here
// ...

// now I want to freeze it and assign it to the field
Test.map = Collections.unmodifiableMap(map);
}
}

编译器不想处理这段代码。我有几个这样的变量,对于所有这些变量,它一直在大喊:“无法为最终变量赋值”。如果我分配给它,它会提示“变量未初始化”。如果我在开始时分配给静态字段,然后尝试使 map 不可修改,它会提示“可能已经分配了变量”。它对任何事情都不满意。

这是语言的缺陷还是编译器的错误?什么是让编译器按要求执行的最佳方式?

最佳答案

最简单的解决方法如下:

import java.util.*;

class Test {
public static final Map<String,Object> map;

static {
Map<String,Object> contents = new HashMap<>();

map = Collections.unmodifiableMap(contents);
}
}

不知何故,如果您在 Java 8 中使用类名限定常量,编译器将不会拥有它。

更新

经过更多的挖掘,似乎 Java Language Specification明确声明需要使用简单(非限定)名称来分配最终字段(突出显示我的):

For every access of a local variable or blank final field x, x must be definitely assigned before the access, or a compile-time error occurs.

Similarly, every blank final variable must be assigned at most once; it must be definitely unassigned when an assignment to it occurs.

Such an assignment is defined to occur if and only if either the simple name of the variable (or, for a field, its simple name qualified by this) occurs on the left hand side of an assignment operator.

关于java - 分配给同名的静态最终字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26770904/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com