Evet yapabilir. Finalin performansı artırabileceği bir örnek:
Koşullu derleme , kod satırlarının belirli bir koşula bağlı olarak sınıf dosyasına derlenmediği bir tekniktir. Bu, bir üretim yapısında tonlarca hata ayıklama kodunu kaldırmak için kullanılabilir.
aşağıdakileri göz önünde bulundur:
public class ConditionalCompile {
private final static boolean doSomething= false;
if (doSomething) {
// do first part.
}
if (doSomething) {
// do second part.
}
if (doSomething) {
// do third part.
}
if (doSomething) {
// do finalization part.
}
}
DoSomething özniteliğini son bir özniteliğe dönüştürerek, derleyiciye doSomething'i her gördüğünde derleme zamanı değiştirme kurallarına göre false ile değiştirmesi gerektiğini söylediniz. Derleyici ilk geçiş kodu değiştirir şey böyle:
public class ConditionalCompile {
private final static boolean doSomething= false;
if (false){
// do first part.
}
if (false){
// do second part.
}
if (false){
// do third part.
}
if (false){
// do finalization part.
}
}
Bu yapıldıktan sonra, derleyici ona bir kez daha bakar ve kodda erişilemez ifadeler olduğunu görür. En kaliteli bir derleyici ile çalıştığınız için, erişilemeyen bayt kodlarının hepsini sevmez. Böylece onları kaldırır ve bununla sonuçlanırsınız:
public class ConditionalCompile {
private final static boolean doSomething= false;
public static void someMethodBetter( ) {
// do first part.
// do second part.
// do third part.
// do finalization part.
}
}
böylece aşırı kodları veya gereksiz koşullu kontrolleri azaltır.
Düzenleme: Örnek olarak, aşağıdaki kodu alalım:
public class Test {
public static final void main(String[] args) {
boolean x = false;
if (x) {
System.out.println("x");
}
final boolean y = false;
if (y) {
System.out.println("y");
}
if (false) {
System.out.println("z");
}
}
}
Bu kodu Java 8 ile derlerken ve kod çözerken javap -c Test.class
:
public class Test {
public Test();
Code:
0: aload_0
1: invokespecial #8 // Method java/lang/Object."<init>":()V
4: return
public static final void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iload_1
3: ifeq 14
6: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream;
9: ldc #22 // String x
11: invokevirtual #24 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
14: iconst_0
15: istore_2
16: return
}
Derlenmiş kodun yalnızca son olmayan değişkeni içerdiğini belirtebiliriz x
. Bu, son değişkenlerin en azından bu basit durum için performanslar üzerinde etkisi olduğunu kanıtlamaktadır.