[英]Java Static/Instance method optimization
在Java中未修改方法变量,缺少了final
,预选赛重新初始化在每次
如果对1.或2。,(或两者)的答案是, final
限定符将允许Java执行优化并仅将方法变量存储一次?
如果答案取决于变量的类型,则优化/未优化哪种类型的变量? 例如, String
, int
优化而Map
未优化?
为了进行比较,Java将仅存储静态类变量,例如
private static final String foo = "Teenage Mutant Ninja Turtle";
一旦。 澄清一下:问题是
1:
static SomeReturnValueOrVoid SomeMethod() {
// 1.a Not modified, is this reinitialized each method call?
String foo = "Teenage Mutant Ninja Turtle";
// 1.b Marked final, is this reinitialized each method call?
final String bar = "Teenage Mutant Hero Turtle";
}
2:
SomeReturnValueOrVoid SomeMethod() { // not static
// 2.a Not modified, is this reinitialized each method call?
String foo = "Teenage Mutant Ninja Turtle";
// 2.b Marked final, is this reinitialized each method call?
final String bar = "Teenage Mutant Hero Turtle";
}
相当于
3:
class SomeClass {
static final String foo = "Teenage Mutant Ninja Turtle";
SomeReturnValueOrVoid SomeMethod() {
// Uses foo
}
static SomeReturnValueOrVoid SomeMethod() {
// Uses foo
}
...
}
在Java中是未修改的方法变量,它们每次都缺少最终的限定符重新初始化
(该方法被调用)-当然可以,否则它们将未被初始化。
我认为您真正想问的是,可以某种方式优化此初始化吗? 如果为变量分配了常量值,则为是;否则,为0。 JIT编译器可能会完全删除该变量,并用其(已知常量)值替换对其的引用。
最终限定符是否将允许Java执行优化并只将方法变量存储一次?
不能。 final
限定的局部变量不能更改其值,但是方法的每次调用都有其自己的变量副本,并且不同的实例化可能对同一final
变量使用不同的值。 考虑:
void someMethod()
{
final int number = new Random().nextInt();
}
该值在程序执行期间不能仅分配一次,因为每次调用该方法都不同。
局部变量的final
修饰符对优化几乎没有或没有直接影响。 它仅对变量可以执行的操作施加了限制-任何变量都可以遵循这些限制,而与final
限定无关,而这又允许进行某些优化。 如果优化程序是值得的,那么它不会在乎该变量是否声明为final
,而是会考虑其是否有效地保持不变。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.