Sen*_*mar 18 java static final public recompile
我碰巧在我的工作场所遇到过Java代码.这是场景:有两个类 - ClassA和ClassB.
ClassA除了4个公共静态最终字符串值之外什么都没有.它的目的是使用那些值ClassA.variable(不要问我为什么,这不是我的代码).
ClassB进口ClassA.我编辑了字符串值ClassA并对其进行了编译.当我跑步时,ClassB我可以看到它使用的是旧值 - 而不是新值.我必须重新编译ClassB才能使用新的值ClassA!(我不得不重新编译其他导入的类ClassA!)
这只是因为JDK 1.6或我之前应该知道重新编译的ClassB!开导我.:)
Dir*_*irk 23
如果final类中的变量值ClassA恰好是编译时常量,则编译器可能已使用ClassA而不是生成运行时引用将它们内联到类中.我想,这就是你所描述的情况.
例:
public class Flags {
public static final int FOO = 1;
public static final int BAR = 2;
}
public class Consumer {
public static void main(String[] args) {
System.out.println(Flags.FOO);
}
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,编译器可能会将值FOO合并到生成的代码中,Consumer而不是生成等效的运行时引用.如果FOO稍后更改的值,则必须重新编译Consumer才能使其使用新值.
这是一种优化,在编译程序的效率和速度方面具有一些优点.例如,内联该值可能会在使用它的表达式中进一步优化,例如:
int x = Flags.FOO * 10;
Run Code Online (Sandbox Code Playgroud)
在这个例子中,内联值(这里:1)使编译器能够注意到,乘法没有区别,并且可以完全省略.