Il s'agit plus d'une question de style que d'un problème direct. Cela suggère que vous n'avez pas bien réfléchi à ce qui se passe dans la classe.
Réfléchissez à ce que static
signifie :
Cette variable existe au niveau de la classe, elle n'existe pas séparément pour chaque instance et il n'a pas d'existence indépendante dans les classes qui me prolongent .
Réfléchissez à ce que protected
signifie :
Cette variable peut être vue par cette classe, les classes du même paquetage et les classes qui m'étendent .
Les deux significations ne s'excluent pas exactement l'une l'autre, mais c'est assez proche.
Le seul cas où l'on pourrait utiliser les deux ensemble est celui d'une classe abstraite conçue pour être étendue et dont la classe d'extension pourrait alors modifier le comportement en utilisant des constantes définies dans la classe d'origine. Ce type d'arrangement finirait très probablement par être très désordonné et indiquerait une faiblesse dans la conception des classes.
Dans la plupart des cas, il est préférable que les constantes soient publiques, car cela rend l'ensemble plus propre et offre plus de flexibilité aux personnes qui créent des sous-classes. Indépendamment de toute autre considération, 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 ce code d'exemple :
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 le site : https://ideone.com/KM8u8O
La classe Test2
est capable d'accéder au membre statique test
de Test
sans avoir besoin de qualifier le nom - mais il n'hérite pas ou n'obtient pas sa propre copie. Il regarde exactement le même objet en mémoire.
6 votes
Il n'y a rien de mal à avoir un champ statique protégé, tant qu'il est
final
. Un champ statique mutable partagé entre plusieurs classes est une source d'inquiétude certaine. La mise à jour d'un champ statique par plusieurs classes ne sera probablement ni fiable ni facile à suivre, d'autant plus que la présence d'un champ ou d'une méthode protégés implique que la classe est destinée à être étendue par des classes d'autres paquets, éventuellement des classes qui ne sont pas sous le contrôle de l'auteur de la classe contenant le champ protégé.6 votes
@VGR,
final
ne signifie pas que le champ est immuable. Vous pouvez toujours modifier le champobject
référencé par unfinal
variable de référence.0 votes
@VGR Je ne suis pas d'accord. La SEULE raison pour laquelle vous créeriez une variable statique est d'y avoir accès à partir d'un autre paquet uniquement par héritage, et l'accès à un seul champ ne devrait PAS être la raison de l'héritage. C'est une conception erronée, IMO, et si vous y avez recours, vous devriez probablement repenser la structure de votre application. Mais ce n'est que mon avis.
1 votes
@LoneRider Vous avez raison. Je pensais à immuable, et final ne le garantit certainement pas.
0 votes
Je suis moi-même venu ici pour répondre à la même question.