Utilisation de méthodes «finales protégées» de superclasse pour conserver un code commun pour les sous-classes
Comme un (pédant) débutant programmeur Java, je voudrais savoir, est-ce une bonne pratique pour déplacer un bloc commun de code que toutes les sous-classes d'utilisation à un autre protégé (final) méthode dans la classe parent? Des tâches comme le remplissage des listes avec des valeurs communes, de la commune ou à des algorithmes de filtrage, etc...
Est-il bon d'utiliser protégé statique méthodes?
class A {
protected final List<String> getVariants() {...}
protected final List<String> filterResults(List<String> variants) {...}
}
class B extends A {
public List<String> doSomethingUsefull() {
List<String> commonVariants = getVariants();
...
return filterResults(commonVariants);
}
}
class C extends A {
public void doSomethingUsefull() {
List<String> commonVariants = getVariants();
...
return filterResults(commonVariants);
}
public void doMoreUsefullThings() {
List<String> commonVariants = getVariants();
...
return filterResults(commonVariants);
}
}
source d'informationauteur dmzkrsk
Vous devez vous connecter pour publier un commentaire.
Si vous êtes un Java débutant, et vous pensez au sujet de ces sortes de choses, alors c'est maintenant un bon moment pour lire le Chapitre 4, "les Classes et les Interfaces" dans un livre intitulé "Effective Java." L'information sera de plus en plus approfondie et nuancée que les réponses que vous obtenez ici.
Voici une façon de penser sur la façon de mélanger la
final
protected
etstatic
mots-clés:static
parce qu'il rompt le paradigme OO.final
mot-clé empêche les sous-classes de remplacement d'une méthode. À cet égard, le résultat est le même qu'avecstatic
.final
devrait être utilisé plus souvent, et c'est une bonne idée de l'utiliser avecprotected
. Voir l'Article 17, dans "Effective Java".protected
etstatic
ne sont pas utilisés très souvent. Vous seriez le mélange d'un OO construire avec une construction qui rompt normal OO comportement, de sorte que la combinaison est impair.Il me semble raisonnable - bien que vous voudrez peut-être faire
A
abstrait. Également envisager l'utilisation de la composition au lieu - pourraitB
etC
contenir unA
au lieu de sous-classement?Tout d'abord, vous ne devriez pas les utiliser s'étend à cette fin parce que trop d'extension sont toujours mauvaise idée.
Deuxièmement, Vous avez entièrement raison que vous ne répétez pas votre code, mais groupant par la répétition de partie de code n'est pas le bon choix. Meilleure façon est de grouper les choses être un sens dans le monde réel, par niveau d'abstraction.
Dernier mais non le moins, Lorsque vous avez des doutes: séparément ou non, l'extension ou la composition, protégé finale ou seulement protégé, essayez d'écrire de test de l'unité de cette classe et les réponses viendront très vite.
J'avais proposer de déplacer toutes ces méthodes pour séparer statique de la classe si ils ne dépendent pas de certains champs de la classe. Rendre util méthodes.