2017-07-03 3 views
0

J'ai une classe comme ceci:Qu'est-ce qui est préféré, en utilisant setter ou builder?

public class Team 
{ 
    private final String id; 

    private final String subOrgId; 

    private final String teamName; 

    private final String costCenter; 

    private final String email; 

    private final String seaSecurityGroup; 

    private final String expesoSecurityGroup; 

    public Team(final String id, final String subOrgId, final String teamName, final String costCenter, 
      final String email, final String seaSecurityGroup, final String expesoSecurityGroup) 
    { 
     this.id = id; 
     this.subOrgId = subOrgId; 
     this.teamName = teamName; 
     this.costCenter = costCenter; 
     this.email = email; 
     this.seaSecurityGroup = seaSecurityGroup; 
     this.expesoSecurityGroup = expesoSecurityGroup; 
    } 

    public String getId() 
    { 
     return id; 
    } 

    public String getSubOrgId() 
    { 
     return subOrgId; 
    } 

    public String getTeamName() 
    { 
     return teamName; 
    } 

    public String getCostCenter() 
    { 
     return costCenter; 
    } 

    public String getEmail() 
    { 
     return email; 
    } 

    public String getSeaSecurityGroup() 
    { 
     return seaSecurityGroup; 
    } 

    public String getExpesoSecurityGroup() 
    { 
     return expesoSecurityGroup; 
    } 
} 

Maintenant, j'ai un cas d'utilisation où je dois en définir une nouvelle valeur de l'ID dans l'équipe de classe. Je suis d'avis que je devrais faire un setter dans la classe pour cela (déclarer id comme non-final) et l'utiliser. Cependant, je pense aussi que je devrais probablement aller de l'avant avec un constructeur et l'utiliser. Alors que l'écriture d'un setter est moins de travail, mais je veux m'assurer que je vais de l'avant avec le bon modèle. Qu'est-ce qui est recommandé dans un tel cas?

Merci!

+0

Seulement vous savez à coup sûr, mais cela ressemble à tout autre POJO qui pourrait être un Javabean –

+0

À mon avis, un constructeur n'est pas le bon modèle. Lorsque vous souhaitez utiliser des objets immuables, vous pouvez ajouter un setter qui crée une nouvelle instance avec uniquement la valeur définie. –

+0

Je ne considèrerais pas cette classe immuable dans une classe mutable sans une pensée sérieuse, si elle est déjà utilisée, des suppositions ont probablement été faites à propos de son immutabilité. –

Répondre

0

Dans l'exemple que vous avez fourni, vous avez défini un grand nombre de variables privées à définir pour l'objet et toutes sont définitives; L'utilisation du modèle de construction serait idéal dans cette situation. Les setters ne sont pas très utiles dans ce cas, car ils ne seront utilisés qu'une fois (puisque toutes les variables de vos objets sont finales).

Ne faites pas votre variable 'id' non-finale. Je suppose que votre objet peut et n'aura qu'une seule valeur 'id' constante pour toute la durée de son existence. C'est exactement ce pour quoi 'final' a été fait. Le rendre non-final bat complètement le but pour lequel 'final' est en place. Donc, gardez la variable 'id' 'finale'. Dans votre cas de basculement, récupérez la valeur d'identifiant souhaitée et placez-la dans une variable. Lorsque vous utilisez le générateur pour créer votre objet Team, utilisez cette variable d'id, en dehors de votre cas de basculement.

Espérons que cela soit clair.

0

En première instance, il ressemble à une classe Java bean (si c'est tout ce que vous voulez avoir un getter et setter avec un constructeur par défaut qui n'est pas présent dans votre classe, parce que je n'aime pas passer tous les paramètres dans le constructeur). Aussi, si à l'avenir vous voulez ajouter la variable 4-5, alors votre code va se casser que vous devez modifier votre constructeur qui peut être évité. Deuxièmement, vous ajoutez ensuite la valeur finale à la variable et vous éliminez le setter menant à la direction dans laquelle vous voulez créer une classe mutable, alors dans ce cas, vous devez également rendre votre classe comme finale. Envisager d'avoir un motif de constructeur en présence de tant de paramètres dans le constructeur.

De même, vous ne devez autoriser aucune propriété setter pour l'ID. Au lieu de cela, créez une nouvelle instance avec une nouvelle valeur d'identifiant. C'est ainsi que fonctionne la mutabilité et qu'il sera bon d'éviter un nouveau bug.

1

Le modèle de générateur n'est pas destiné à être utilisé si l'on veut modifier les attributs (simples) d'un objet.

modèle Builder résout le problème avec un grand nombre de paramètres facultatifs et état incohérent en fournissant un moyen de construire l'étape par étape d'objet et de fournir une méthode qui retournera en fait le objet final. source: JournalDev

Lorsque vous voulez juste de mettre à jour un seul attribut d'une classe existante, en utilisant un setter est parfaitement bien, c'est ce qu'ils sont pour, en fait.

Il est difficile d'évaluer s'il est judicieux de modifier l'ID de cet objet sans connaître le contexte de votre application. Créer un nouvel objet avec un nouvel identifiant pourrait aussi être une option.