Constructeurs ou constructeurs? Nous raisonnons à voix haute

salut! Je veux spéculer sur l'opportunité d'utiliser des constructeurs pour des objets simples.



Pour plus de simplicité, j'utiliserai les annotations lombok'a:



@Value

@Builder



Après un peu de recherche sur Google, nous obtenons ce constructeur - Sépare la construction d'un objet complexe de sa présentation afin qu'à la suite du même processus de construction, différentes vues puissent être obtenues. Est-ce uniquement pour les objets complexes?



Regardons un exemple simple:



@Value
public class Info {
    @Nullable String uuid;
    @Nullable String email;
    @Nullable String phone;
}


Une classe assez simple. En fait, nous obtenons un objet immuable qui est initialisé via le constructeur.



Mais, comme nous pouvons le voir, tous les champs sont nullables, et créer de tels objets ne sera pas très joli:



        final Info info1 = new Info(null, "email@email.com", "79998888888");
        final Info info2 = new Info("3d107928-d225-11ea-87d0-0242ac130003", null, null);
        final Info info3 = new Info("3d107928-d225-11ea-87d0-0242ac130003 ", "email@email.com", null);
...


Il existe certainement des options:



  1. Les objets avec quelques champs de types différents peuvent être livrés avec plusieurs constructeurs. Mais cela ne résout pas le problème de la classe ci-dessus.
  2. L'utilisation de setters est subjective, elle encombre le code.




Et le constructeur?



@Value
@Builder
public class Info {
    @Nullable String uuid;
    @Nullable String email;
    @Nullable String phone;
}


On obtient une construction très élégante d'un objet simple :



        final Info info1 = Info.builder()
                .uuid("3d107928-d225-11ea-87d0-0242ac130003")
                .phone("79998888888")
                .build();
        final Info2 info2 = Info.builder()
                .email("email@email.com")
                .phone("79998888888")
                .build();
...
}


Cependant, pour utiliser jackson dans le projet, il est nécessaire d'ajouter notre classe afin qu'elle se désérialise avec succès:



@Value
@Builder(builderClassName = "InfoBuilder")
@JsonDeserialize(builder = Info.InfoBuilder.class)
public class Info {
    @Nullable String uuid;
    @Nullable String email;
    @Nullable String phone;

    @JsonPOJOBuilder(withPrefix = "")
    public static class InfoBuilder {

    }
}


Nous obtenons nos avantages et nos inconvénients pour les deux approches:



constructeur:



+

1. Le code devient plus concis.

3. null dans les paramètres du constructeur n'est pas visible.

2. Moins de risque de confusion des paramètres du même type.

-

1. Nous créons un objet supplémentaire que le GC dans son ensemble supprimera en toute sécurité, mais vous ne devez pas l'oublier.

2. Si nécessaire, utilisez jackson - empilez la classe.



constructeur:



+

1. Empile au minimum notre classe, pas d'eau.

2. Aucune création d'objets inutiles.

-

1. Très souvent nul arrivera dans le constructeur d'un tel objet.

2. Il y a une possibilité de faire une erreur lorsque quelqu'un change le code.



Résultat



D'après mon expérience, j'ai tendance à utiliser des constructeurs. Le coût n'est pas élevé, mais le résultat est un code agréable à lire.



Et bien sûr, écrivez des tests pour éviter le 2ème point négatif de l'utilisation de constructeurs.



PS Ceci est mon premier article, je serai reconnaissant pour les critiques constructives et les commentaires.



All Articles