È più una cosa stilistica che un problema diretto. Suggerisce che non hai riflettuto adeguatamente su cosa sta succedendo con la classe.
Pensa a cosa static
significa:
Questa variabile esiste a livello di classe, non esiste separatamente per ogni istanza e non ha un'esistenza indipendente nelle classi che mi estendono .
Pensa a cosa protected
significa:
Questa variabile può essere vista da questa classe, classi nello stesso pacchetto e classi che mi estendono .
I due significati non si escludono esattamente a vicenda, ma sono piuttosto vicini.
L'unico caso che posso vedere dove potresti usare i due insieme è se avessi una classe astratta che è stata progettata per essere estesa e la classe che si estende potrebbe quindi modificare il comportamento utilizzando le costanti definite nell'originale. Questo tipo di accordo molto probabilmente finirebbe per essere molto disordinato e indica debolezza nel design delle classi.
Nella maggior parte dei casi sarebbe meglio avere le costanti come pubbliche poiché ciò rende tutto più pulito e consente alle persone di sottoclassare una maggiore flessibilità. A prescindere da qualsiasi altra cosa, in molti casi la composizione è preferibile all'ereditarietà, mentre le classi astratte forzano l'ereditarietà.
Per vedere un esempio di come questo potrebbe rompere le cose e per illustrare cosa intendo per la variabile che non ha un'esistenza indipendente, prova questo codice di esempio:
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;
}
}
Vedrai i risultati:
test
changed
Provalo tu stesso su: https://ideone.com/KM8u8O
La classe Test2
è in grado di accedere al membro statico test
da Test
senza la necessità di qualificare il nome - ma non eredita o ottenere la propria copia. Sta guardando lo stesso identico oggetto nella memoria.
final
. Un campo statico mutevole condiviso tra le classi è sicuramente motivo di preoccupazione. È improbabile che più classi che aggiornano un campo statico siano affidabili o facili da seguire, soprattutto perché la presenza di qualsiasi campo o metodo protetto implica che la classe è destinata ad essere estesa da classi in altri pacchetti, possibilmente classi non sotto il controllo del autore della classe contenente il campo protetto.