我在位于IBM Websphere App Server 7.0上的不同jar中有两个Java类(它有些旧,但是我不得不在项目中使用它)。
第一类具有一个静态的final字段:
public class TFFVERSION {
public static final String ACTUAL_VERSION = "8.3";
}
第二个以非静态方法使用该字段:
xslTemplate = String.format("%s_v%s", xslTemplate, TFFVERSION.ACTUAL_VERSION);
我正在尝试理解的是为什么编译器将常量8.3
的副本放入String.format
调用中?这使得仅更改第一类而不重新编译和重新部署第二类是不可能的。
这是IBM Java V9中的一种优化还是Bug?
在这里,我已经在显示问题的文本编辑器中打开了类文件(可单击图像以获得更好的分辨率):
Java反编译器可显示正确的静态字段调用。第二类中没有其他8.3
常量。
答案 0 :(得分:2)
这通常是这样工作的,它是由javac而不是由IBM的Java版本完成的。创建两个类,其中一个使用另一个的静态最终常量并运行,然后仅重新编译带有该常量的类,然后看看会发生什么。或者看看字节码。
如果希望能够在一行中更改常量,请使用一种方法公开该常量,并在运行时支付少量的性能开销。