Java 公共静态final和OSGi的编译器优化

Java 公共静态final和OSGi的编译器优化,java,osgi,compiler-optimization,Java,Osgi,Compiler Optimization,我有一个OSGi包b1导出一个类 public static final String MYVAL = "a"; //version 1 第二个bundle b2是使用b1的版本1编译和部署的 稍后,我将b1中的值更改为 public static final String MYVAL = "b"; //version 2 但我只重新编译和部署b1,b2没有改变,也没有重新编译 b2是否仍有可能在运行时看到值a 引用的静态final原语或字符串的值直接内联到using类中。因此与OSGI和任

我有一个OSGi包b1导出一个类

public static final String MYVAL = "a"; //version 1
第二个bundle b2是使用b1的版本1编译和部署的

稍后,我将b1中的值更改为

public static final String MYVAL = "b"; //version 2
但我只重新编译和部署b1,b2没有改变,也没有重新编译


b2是否仍有可能在运行时看到值
a

引用的静态final原语或字符串的值直接内联到using类中。因此与OSGI和任何可见性规则无关,
b2
仍将包含一个嵌入的
MYVAL
值“a”

我认为这在以下文件中有记录:

如果某个字段是常量变量(§4.12.4),则删除关键字final或更改其值不会因使其不运行而破坏与先前存在的二进制文件的兼容性,但除非重新编译,否则不会看到该字段使用的任何新值。即使用法本身不是编译时常量表达式(§15.28),也是如此

显示了一个变通方法。更改声明使其不再是常量表达式将禁用此内联行为

public static final String MYVAL = String.valueOf("a");

您应该能够避免使用新的String对象,并使用插入的“a”和:
publicstaticfinalstringmyval;{MYVAL=“a”}
@BJHargrave:
valueOf
委托给
toString
,实际上它将返回相同的内部实例。我在创建数值常量时使用了
valueOf
来保持一致,如
Integer.valueOf(1)
中所述。True,但valueOf是一个必须执行的方法,而
=“a”
是常量池中字符串的赋值。