为什么这个变量不被认为是最终的?这段代码没有编译,我会说它是一个bug或至少是奇怪的..
public class QualifierConfiguration {
public static final String RANK_CALCULATOR = RankCalculatorImpl.class.getName();
}
public class Implementation{
private final RankCalculator rankCalculator;
public Implementation(@Qualifier(QualifierConfiguration.RANK_CALCULATOR) RankCalculator rankCalculator){
this.rankCalculator = rankCalculator;
}
}
,即使这不起作用
public class QualifierConfiguration {
public static final String RANK_CALCULATOR = getValue();
private static String getValue(){
return "string";
}
}
答案 0 :(得分:1)
final
变量不一定是编译时常量:
变量可以声明为final。最终变量只能分配给一次 ...
常量变量是基本类型或类型String
的最终变量,使用常量表达式§15.28)进行初始化。
RankCalculatorImpl.class.getName()
不是常量表达式,getValue()
也不是。
请注意,对于具有Class
值的注释,由于注释的特定规则,允许使用类RankCalculatorImpl.class
等类文字,但它们仍然不会生成编译时常量(同样适用)到enum
常量引用)。对于原始值和String
值,the specification明确要求注释值的常量表达式:
当且仅当下列之一为真时,元素类型
T
才与元素值V
相称:
...
T
不是数组类型,V
的类型与T分配兼容(第5.2节),并且:
- 如果
T
是基本类型或String
,则V
是常量表达式(第15.28节)。- 如果
T
为Class
或调用Class
(§4.5),则V
为类文字(第15.8.2节)。- 如果
T
是枚举类型(§8.9),则V
是枚举常量(§8.9.1)。V
不是null
。
所以在这里,除了将实际限定名称指定为字符串文字之外别无选择:
public static final String RANK_CALCULATOR = "actual.package.name.RankCalculatorImpl";
答案 1 :(得分:0)