Ya itu bisa. Ini adalah contoh di mana final dapat meningkatkan kinerja:
Kompilasi bersyarat adalah teknik di mana baris kode tidak dikompilasi ke dalam file kelas berdasarkan kondisi tertentu. Ini dapat digunakan untuk menghapus banyak kode debug dalam build produksi.
pertimbangkan hal berikut:
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.
}
}
Dengan mengubah atribut doSomething menjadi atribut final, Anda telah memberi tahu kompiler bahwa setiap kali ia melihat doSomething, ia harus menggantinya dengan false sesuai dengan aturan substitusi waktu kompilasi. Lulus pertama dari compiler mengubah kode untuk sesuatu seperti ini:
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.
}
}
Setelah ini selesai, kompiler akan memeriksanya lagi dan melihat bahwa ada pernyataan yang tidak terjangkau dalam kode. Karena Anda bekerja dengan kompiler berkualitas tinggi, itu tidak suka semua kode byte yang tidak dapat dijangkau. Jadi itu menghapus mereka, dan Anda berakhir dengan ini:
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.
}
}
sehingga mengurangi kode yang berlebihan, atau pemeriksaan bersyarat yang tidak perlu.
Sunting: Sebagai contoh, mari kita ambil kode berikut:
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");
}
}
}
Ketika mengkompilasi kode ini dengan Java 8 dan mendekompilasi dengan javap -c Test.class
kita mendapatkan:
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
}
Kita dapat mencatat bahwa kode yang dikompilasi hanya mencakup variabel non-final x
. Ini membuktikan bahwa variabel akhir memiliki dampak pada kinerja, setidaknya untuk kasus sederhana ini.