Y a-t-il un moyen de forcer les cours à Java pour avoir un champ final statique public (par interface ou une classe abstraite)? Ou au moins un champ public? P>
J'ai besoin de vous assurer d'une manière ou d'une autre qu'un groupe de classes a p>
en eux. P> Type de chaîne finale statique publique = "..."; code> p>
6 Réponses :
Non, vous ne pouvez pas.
Vous ne pouvez que les forcer à avoir une méthode de getter non statique, qui retournerait la valeur appropriée pour chaque sous-classe: P>
public abstract String getType();
Il n'ya aucun moyen de faire appliquer le compilateur, mais je voudrais créer une personnalisation Findbugs ou règle de contrôle qui pourrait vérifier cela. P>
Je ne pense pas que ce soit possible. Mais vous pouvez faire une interface avec une méthode gettype p>
Vous pouvez définir une interface comme ceci: et vous pouvez créer des classes implémenter cette interface qui aura alors ce champ avec Si vous voulez que les classes aient Valeurs différentes forte>, vous pouvez définir une fonction dans l'interface comme ceci: p> et La mise en œuvre de classes devra mettre en œuvre la fonction qui peut renvoyer différentes valeurs si nécessaire. P> Remarque: cela fonctionne de la même manière avec des classes abstraites. P> P>
+1: J'étais sur le point de descendre une autre réponse parce que je n'ai pas réalisé que l'OP ne voulait avoir que l'identifiant, pas la valeur, être la même.
Implémentez une interface dans vos classes et appelez une méthode à partir de cette interface, comme Autres ont suggéré. p>
Si vous devez absolument avoir un champ statique, vous pouvez faire un test unitaire qui passera à travers les classes et vérifie avec API de réflexion que chaque classe a ce domaine final statique public. Échouer la construction si ce n'est pas le cas. P>
ou au moins juste un champ public? p>
C'est imo le moyen habituel d'aller: dans la superclasse, nécessite une valeur dans le constructeur: p>
xxx pré> de cette façon, toutes les implémentations doivent appeler ce super-constructeur - et ils n'ont pas à implémenter getType () chacun. p> blockQuote>
Mais vous ne pouvez pas appeler gettype () statiquement.
Non, tu ne peux pas. Mais c'était la deuxième partie de sa question: "... avoir un domaine final statique public ... ou du moins un domaine public?" Je comprends donc la question suivante: je voudrais le faire statiquement, mais si cela n'est pas possible, alors au moins de manière non statique.
Qu'essayez-vous de faire? Vous faites quelque chose qui utilise la réflexion, non? Sinon, vous n'auriez pas le problème (si le champ est référencé avec
myClass.field code> mais il n'existe pas, il ne sera pas compilé, il n'est pas appliqué implicitement ou que le champ n'est pas référencé dans ce cas Ne vous souciez pas)Vous voudrez peut-être envisager une usine ou similaire.
@Tom pourquoi prendre la peine d'une classe de mappage -> Type? Utilisez simplement le nom pleinement qualifié de la classe.
Les champs publics sont mauvais ... Si quelqu'un dépend d'eux, et un jour, vous changez du champ, le code client se casse
Le code client @Helper ne copie que les valeurs si
statique finale code> sont initialisés avec une constante de temps de compilation i> (telle que définie par les JLS - essentiellement primitive et cordes, littéraux, opérateurs, opérateurs, opérateurs, non Méthodes appels, pas de nulls).