Un modèle que je vois parfois est qu'un constructeur peut ne prendre aucun argument ou un argument. Maintenant, je me demande si la «meilleure» approche est de déplacer le code commun vers le constructeur le plus défini - ou d'utiliser l ' initialiseur d'instance dans ce cas. Par exemple, une façon de toujours générer un ID pour chaque classe créée:

 public SomeClass(){
     this("Hello");
 }

 public SomeClass(String s){
     this.s = s;
     this.id = generateId();
 }

Par rapport à l'écrire comme ceci:

 {
     this.id = generateId(); // method does not depend on the class
 }

 public SomeClass(){
      this("Hello");
 }

 public SomeClass(String s){
      this.s = s;
 }

La raison d'utiliser l'initialiseur d'instance serait que je veux toujours exécuter la méthode lorsque la classe est créée, et à l'avenir, quelqu'un d'autre pourrait changer les constructeurs de la classe et oublier de le faire. Bien qu'il soit moins probable de supprimer l'initialiseur d'instance (sans réaliser ce que vous faites).

Mais d'un autre côté, je ne suis pas sûr de la lisibilité dans ce cas.

Les exemples sont un peu artificiels, pas des exemples du monde réel.

0
Dylan Meeus 1 août 2017 à 10:55

2 réponses

Meilleure réponse

La raison de l'utilisation de l'initialiseur d'instance serait parce que je veux toujours exécuter la méthode lorsque la classe est créée, et à l'avenir, quelqu'un d'autre pourrait changer les constructeurs de la classe et oublier de le faire. Bien qu'il soit moins probable de supprimer l'initialiseur d'intance (sans savoir ce que vous faites).

Faire l'un (en utilisant l'initialiseur d'instance) ou l'autre (constructeur) ne doit pas être utilisé comme astuce pour éviter une erreur de codage lorsque la classe est modifiée.
Et de toute façon, pourquoi Initializer donnerait une meilleure assurance à ce sujet?

Vous voulez vous assurer que le constructeur fait ce qu'il a prévu de faire?
Ecrire un test unitaire qui valide ce comportement et qui s'exécute automatiquement à chaque build.
C'est tout.

3
davidxxx 1 août 2017 à 08:01

Je n'ai jamais vu une utilisation de l'initialiseur instnace dans la vraie vie. (En fait, je l'ai vu et j'ai joué avec pendant un moment dans l'une des questions théoriques sur ce site). Dans la vraie vie, vous pouvez souvent voir un bloc d'initialisation statique:

public class Bla {
  static {
     //do something
  }
  ....
}

En ce qui concerne le code commun, ce qui pourrait être fait est d'avoir une méthode appelée init() qui est appelée par tous les constructeurs. Dans votre exemple, cela ressemblerait à

 public SomeClass(){
      this("Hello");
 }

 public SomeClass(String s){
      init();
      this.s = s;
 }

  private init()  {
     this.id = generateId(); // method does not depend on the class
 }
0
Michael Gantman 1 août 2017 à 08:07