8
votes

Toute façon de forcer les cours à avoir un domaine final statique public à Java?

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?

J'ai besoin de vous assurer d'une manière ou d'une autre qu'un groupe de classes a

Type de chaîne finale statique publique = "...";

en eux.


5 commentaires

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 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 sont initialisés avec une constante de temps de compilation (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).


6 Réponses :


8
votes

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();


0 commentaires

1
votes

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.


0 commentaires

1
votes

Je ne pense pas que ce soit possible. Mais vous pouvez faire une interface avec une méthode gettype


0 commentaires

6
votes

Vous pouvez définir une interface comme ceci: xxx

et vous pouvez créer des classes implémenter cette interface qui aura alors ce champ avec la même valeur déclarée dans l'interface . Notez que cette pratique est appelée Interface constante anti-motif .

Si vous voulez que les classes aient Valeurs différentes , vous pouvez définir une fonction dans l'interface comme ceci: xxx

et La mise en œuvre de classes devra mettre en œuvre la fonction qui peut renvoyer différentes valeurs si nécessaire.

Remarque: cela fonctionne de la même manière avec des classes abstraites.


1 commentaires

+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.



0
votes

Implémentez une interface dans vos classes et appelez une méthode à partir de cette interface, comme Autres ont suggéré.

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.


0 commentaires

0
votes

ou au moins juste un champ public?

C'est imo le moyen habituel d'aller: dans la superclasse, nécessite une valeur dans le constructeur: xxx

de cette façon, toutes les implémentations doivent appeler ce super-constructeur - et ils n'ont pas à implémenter getType () chacun.


2 commentaires

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.