C'est plus un problème stylistique qu'un problème direct. Cela suggère que vous n'avez pas bien réfléchi à ce qui se passe avec la classe.
Pensez à ce que static
signifie:
Cette variable existe au niveau de la classe, elle n'existe pas séparément pour chaque instance et elle n'a pas d'existence indépendante dans les classes qui me prolongent .
Pensez à ce que protected
signifie:
Cette variable peut être vue par cette classe, les classes dans le même package et les classes qui me prolongent .
Les deux significations ne sont pas exactement mutuellement exclusives, mais elles sont assez proches.
Le seul cas que je peux voir où vous pourriez utiliser les deux ensemble est si vous aviez une classe abstraite qui a été conçue pour être étendue et que la classe d'extension pourrait alors modifier le comportement en utilisant les constantes définies dans l'original. Ce genre d'arrangement finirait probablement par être très compliqué et indique une faiblesse dans la conception des classes.
Dans la plupart des cas, il serait préférable que les constantes soient publiques, car cela rend tout plus propre et permet aux personnes de sous-classer plus de flexibilité. Indépendamment de toute autre chose, dans de nombreux cas, la composition est préférable à l'héritage, tandis que les classes abstraites forcent l'héritage.
Pour voir un exemple de la façon dont cela pourrait casser les choses et pour illustrer ce que je veux dire par la variable n'ayant pas d'existence indépendante, essayez cet exemple de code:
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;
}
}
Vous verrez les résultats:
test
changed
Essayez-le vous-même sur: https://ideone.com/KM8u8O
La classe Test2
peut accéder au membre statique à test
partir de Test
sans avoir besoin de qualifier le nom - mais elle n'hérite ni n'obtient sa propre copie. Il regarde exactement le même objet en mémoire.
final
. Un champ statique mutable partagé entre les classes est certainement un sujet de préoccupation. Plusieurs classes mettant à jour un champ statique ne seront probablement pas fiables ou faciles à suivre, d'autant plus que la présence de tout champ ou méthode protégé implique que la classe est censée être étendue par des classes dans d'autres packages, éventuellement des classes non sous le contrôle du auteur de la classe contenant le champ protégé.