[英]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.