Ini lebih merupakan masalah gaya daripada masalah langsung. Ini menunjukkan bahwa Anda belum memikirkan dengan baik apa yang terjadi dengan kelas.
Pikirkan tentang apa static
artinya:
Variabel ini ada di tingkat kelas, tidak ada secara terpisah untuk setiap contoh dan tidak memiliki keberadaan independen di kelas yang memperpanjang saya .
Pikirkan tentang apa protected
artinya:
Variabel ini dapat dilihat oleh kelas ini, kelas dalam paket yang sama, dan kelas yang memperpanjang saya .
Kedua arti itu tidak sepenuhnya eksklusif tetapi cukup dekat.
Satu-satunya kasus yang dapat saya lihat di mana Anda dapat menggunakan keduanya bersama-sama adalah jika Anda memiliki kelas abstrak yang dirancang untuk diperpanjang dan kelas yang diperluas kemudian dapat mengubah perilaku menggunakan konstanta yang ditentukan dalam aslinya. Pengaturan semacam itu kemungkinan besar akan berakhir sangat berantakan dan menunjukkan kelemahan dalam desain kelas.
Dalam kebanyakan kasus, akan lebih baik untuk memiliki konstanta sebagai publik karena itu hanya membuat semuanya lebih bersih dan memungkinkan orang-orang untuk membuat sub-klasifikasi lebih fleksibel. Terlepas dari hal lain dalam banyak kasus, komposisi lebih disukai daripada pewarisan, sementara kelas abstrak memaksakan pewarisan.
Untuk melihat satu contoh bagaimana ini dapat merusak sesuatu dan untuk menggambarkan apa yang saya maksud dengan variabel yang tidak memiliki keberadaan independen coba kode contoh ini:
public class Program {
public static void main (String[] args) throws java.lang.Exception {
System.out.println(new Test2().getTest());
Test.test = "changed";
System.out.println(new Test2().getTest());
}
}
abstract class Test {
protected static String test = "test";
}
class Test2 extends Test {
public String getTest() {
return test;
}
}
Anda akan melihat hasilnya:
test
changed
Coba sendiri di: https://ideone.com/KM8u8O
Kelas Test2
dapat mengakses anggota statis test
dari Test
tanpa perlu mengkualifikasikan nama - tetapi tidak mewarisi atau mendapatkan salinannya sendiri. Ia melihat objek yang sama persis dalam memori.
final
. Bidang statis yang bisa berubah yang dibagikan di seluruh kelas pasti menimbulkan kekhawatiran. Beberapa kelas yang memperbarui bidang statis sepertinya tidak dapat diandalkan atau mudah diikuti, terutama karena keberadaan bidang atau metode yang dilindungi menyiratkan bahwa kelas tersebut dimaksudkan untuk diperluas oleh kelas dalam paket lain, mungkin kelas yang tidak berada di bawah kendali penulis kelas yang berisi bidang yang dilindungi.