Comment réparer "Constructor Calls Overridable Method"
J'ai la configuration suivante qui est de me donner un message indiquant que "Constructeur Appelle Méthode Remplaçable". Je sais ce qui se passe, mais ma question est de savoir comment y remédier de sorte que le code fonctionne toujours et le message disparaît.
public interface Foo{
void doFoo();
}
public class FooImpl implements Foo{
@Override{
public void doFoo(){
//.. Do important code
}
}
public class Bar{
private FooImpl fi;
public Bar(){
fi = new FooImpl();
fi.doFoo(); //The message complains about this line
}
}
Merci!
source d'informationauteur user973479
Vous devez vous connecter pour publier un commentaire.
De Efficace Java 2nd EditionPoint 17: Conception et document pour l'héritage, ou bien de l'interdire:
Invocation d'une méthode remplaçable cours de construction de l'objet peut entraîner l'utilisation de données non initialisées, conduisant à des exceptions d'exécution ou à des résultats imprévus.
Constructeurs doivent appeler uniquement les méthodes qui sont définitives ou privé
Vous pouvez utiliser statique usine méthodes pour résoudre le problème, vous devez créer vos objets à partir de la
Bar class
.Efficace Java, Article 1: Envisager statique usine méthodes à la place des constructeurs
Donc, vous allez avoir l'interface :
et la mise en œuvre:
Pour créer votre classe avec votre méthode de fabrique qui vous permettrait de travailler de cette manière:
Utiliser l'interface pour définir la variable de votre classe
private Foo fi
au lieu deprivate FooImpl fi
l'utilisation d'interfaces plus de types de béton est la clé pour une bonne encapsulation et pour le couplage de votre code.Faire votre constructeur par défaut privé pour empêcher l'instanciation de la classe à l'extérieur.
privé Bar() {
//Empêche l'instanciation
}
Supprimer tous les appels à remplacer les méthodes qui sont présents dans votre constructeur.
Créer votre statique méthode de fabrique
Finalement, vous obtenez une classe
Bar
avec une méthode de fabrique, comme :Mon Patron dit: “le Sonar mises en garde sont sur symptômespas sur le maladie. C'est mieux quand vous pouvez traiter la maladie.” !
Vous pouvez déclarer doFoo comme final si vous n'avez pas besoin de remplacer cette méthode tard:
public final void doFoo() {
}
Votre IDE est vous dire que, parce qu'il est potentiellement dangereux. Vous pouvez fournir des implimentation ou doFoo et de faire toutes les Barre d'objets de différentes choses sur le démarrage. Cela ressemble à un mauvais choix de conception dans la plupart des cas.
Il semble que vous soyez à l'aide d'un modèle de stratégie, dans un constructeur. Il n'est pas sage d'utiliser une stratégie ou tout autre overidable comportement dans le constructeur. L'utiliser ailleurs.
La source de l'erreur que vous voyez est PMD (y chercher "overr"), et lors de la construction de votre exemple de nouveau, cette alarme n'est pas déclenchée par cette version de la PMD (4.2.6). Sonar seulement intègre PMD, Checkstyle et d'autres outils, et fournit une vue d'ensemble. Afin de vérifier la version de Sonar (et DGM) que vous utilisez.
Vous pouvez regarder que dans Sonar:
Sonar > Quality Profiles > Search for "overr"
doit mettre en évidence la règle que vous utilisez.Dans Sonar, vous pouvez vérifier la version de la PMD vous utilisez. Aller à
Sonar > Configuration > Update Center
et coup d'oeil à la version de la PMD vous utilisez.