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 X
dalam skala (panjang) dan mendefinisikan kembali X = scale(10) + 3
, cetakan akan X = 0
kemudian X = 3
. Ini berarti bahwa X
sementara diatur ke 0
dan 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 final
tidak jelas?
Berikut adalah kode yang saya minati.
X
Ditetapkan dua nilai berbeda: 0
dan 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 final
tag. 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 a
ditandai final
, ia mendapatkan output berikut:
a=5
a=5
yang tidak melibatkan bagian utama dari pertanyaan saya: Bagaimana suatu final
variabel 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.
X
anggota ini seperti merujuk ke anggota subkelas sebelum konstruktor kelas super selesai, itu masalah Anda dan bukan definisifinal
.