Pertama, sebuah teka-teki: Apa yang dicetak oleh kode berikut?
public class RecursiveStatic {
public static void main(String[] args) {
System.out.println(scale(5));
}
private static final long X = scale(10);
private static long scale(long value) {
return X * value;
}
}
Menjawab:
0
Spoiler di bawah ini.
Jika Anda mencetak Xdalam skala (panjang) dan mendefinisikan kembali X = scale(10) + 3, cetakan akan X = 0kemudian X = 3. Ini berarti bahwa Xsementara diatur ke 0dan kemudian diatur ke 3. Ini merupakan pelanggaran final!
Pengubah statis, dalam kombinasi dengan pengubah akhir, juga digunakan untuk mendefinisikan konstanta. Pengubah akhir menunjukkan bahwa nilai bidang ini tidak dapat berubah .
Sumber: https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html [penekanan ditambahkan]
Pertanyaan saya: Apakah ini bug? Apakah finaltidak jelas?
Berikut adalah kode yang saya minati.
XDitetapkan dua nilai berbeda: 0dan 3. Saya percaya ini merupakan pelanggaran final.
public class RecursiveStatic {
public static void main(String[] args) {
System.out.println(scale(5));
}
private static final long X = scale(10) + 3;
private static long scale(long value) {
System.out.println("X = " + X);
return X * value;
}
}
Pertanyaan ini telah ditandai sebagai kemungkinan duplikat dari urutan inisialisasi bidang statis Java akhir . Saya percaya bahwa pertanyaan ini bukan duplikat karena pertanyaan lain membahas urutan inisialisasi sementara pertanyaan saya membahas inisialisasi siklik yang dikombinasikan dengan finaltag. Dari pertanyaan lain saja, saya tidak akan bisa mengerti mengapa kode dalam pertanyaan saya tidak membuat kesalahan.
Ini sangat jelas dengan melihat output yang didapat ernesto: saat aditandai final, ia mendapatkan output berikut:
a=5
a=5
yang tidak melibatkan bagian utama dari pertanyaan saya: Bagaimana suatu finalvariabel mengubah variabelnya?
A blank final instance variable must be definitely assigned (§16.9) at the end of every constructor (§8.8) of the class in which it is declared; otherwise a compile-time error occurs.
Xanggota ini seperti merujuk ke anggota subkelas sebelum konstruktor kelas super selesai, itu masalah Anda dan bukan definisifinal.