Es ist eher eine stilistische Sache als ein direktes Problem. Es deutet darauf hin, dass Sie nicht richtig überlegt haben, was mit der Klasse los ist.
Überlegen Sie, was static
bedeutet:
Diese Variable existiert auf Klassenebene, existiert nicht für jede Instanz separat und hat keine unabhängige Existenz in Klassen, die mich erweitern .
Überlegen Sie, was protected
bedeutet:
Diese Variable kann von dieser Klasse, Klassen im selben Paket und Klassen, die mich erweitern, gesehen werden .
Die beiden Bedeutungen schließen sich nicht gerade gegenseitig aus, sind aber ziemlich nahe beieinander.
Der einzige Fall, in dem ich sehen kann, wo Sie die beiden zusammen verwenden könnten, ist, wenn Sie eine abstrakte Klasse hatten, die erweitert werden sollte, und die erweiterte Klasse dann das Verhalten mithilfe der im Original definierten Konstanten ändern könnte. Diese Art der Anordnung würde jedoch höchstwahrscheinlich sehr chaotisch enden und auf eine Schwäche im Design der Klassen hinweisen.
In den meisten Fällen wäre es besser, die Konstanten als öffentlich zu haben, da dies nur alles sauberer macht und den Personen, die in Unterklassen unterteilt sind, mehr Flexibilität ermöglicht. Abgesehen von allem anderen ist in vielen Fällen die Komposition der Vererbung vorzuziehen, während abstrakte Klassen die Vererbung erzwingen.
Um ein Beispiel dafür zu sehen, wie dies Dinge zerstören könnte, und um zu veranschaulichen, was ich damit meine, dass die Variable keine unabhängige Existenz hat, versuchen Sie diesen Beispielcode:
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;
}
}
Sie sehen die Ergebnisse:
test
changed
Probieren Sie es selbst aus unter: https://ideone.com/KM8u8O
Die Klasse kann von ohne Test2
Zugriff auf den Namen auf das statische Mitglied zugreifen, erbt jedoch keine eigene Kopie und erhält keine eigene Kopie. Es betrachtet genau dasselbe Objekt im Speicher.test
Test
final
. Ein veränderbares statisches Feld, das von mehreren Klassen gemeinsam genutzt wird, gibt definitiv Anlass zur Sorge. Es ist wahrscheinlich, dass mehrere Klassen, die ein statisches Feld aktualisieren, nicht zuverlässig oder leicht zu verfolgen sind, insbesondere da das Vorhandensein eines geschützten Felds oder einer geschützten Methode impliziert, dass die Klasse durch Klassen in anderen Paketen erweitert werden soll, möglicherweise Klassen, die nicht unter der Kontrolle von stehen Autor der Klasse, die das geschützte Feld enthält.