2017-07-03 1 views
0

Ich habe eine Klasse wie folgt aus:Was ist bevorzugt, mit Setter oder 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; 
    } 
} 

Jetzt habe ich einen Anwendungsfall, wo in ich einen neuen Wert der ID in der Klasse-Team einstellen müssen. Ich bin der Meinung, dass ich dafür in der Klasse einen Setter machen sollte (deklariere id als nicht-final) und benutze das. Ich denke aber auch, dass ich wahrscheinlich einen Baumeister bauen und das benutzen sollte. Ein Setter zu schreiben ist zwar weniger Arbeit, aber ich möchte sicherstellen, dass ich mit dem richtigen Muster fortfahre. Was ist in einem solchen Fall zu empfehlen?

Danke!

+0

Nur Sie wissen sicher, aber das sieht aus wie jeder andere POJO, der ein Javabean sein könnte –

+0

Meiner Meinung nach ist ein Builder nicht das richtige Muster. Wenn Sie unveränderliche Objekte verwenden möchten, können Sie einen Setter hinzufügen, der eine neue Instanz mit nur dem geänderten Wert erstellt. –

+0

Ich würde diese unveränderliche Klasse nicht ohne ernsthafte Überlegung in eine wandelbare Klasse einbeziehen, wenn sie bereits in Verwendung ist, sind wahrscheinlich Annahmen darüber getroffen worden, dass sie unveränderlich ist. –

Antwort

0

In dem von Ihnen bereitgestellten Beispiel müssen Sie viele private Variablen für das Objekt festlegen, und all diese sind endgültig. Das Builder-Muster wäre in dieser Situation ideal. Setter sind in diesem Fall nicht sehr nützlich, da sie nur einmal verwendet werden (da alle Ihre Objektvariablen endgültig sind).

Machen Sie Ihre ID-Variable nicht als nicht-final. Ich gehe davon aus, dass Ihr Objekt für die gesamte Dauer seiner Existenz nur einen konstanten "ID" -Wert haben kann und wird. Genau dafür wurde "final" gemacht. Wenn man es nicht-final macht, wird der Zweck, für den "final" vorhanden ist, komplett zunichte gemacht.

Also behalten Sie die 'id' Variable 'final'. In Ihrem Switch-Fall erhalten Sie den gewünschten ID-Wert und fügen ihn in eine Variable ein. Wenn Sie den Builder zum Erstellen Ihres Team-Objekts verwenden, verwenden Sie diese ID-Variable außerhalb Ihres Switch-Falls.

Hoffe, das ist klar.

0

In erster Instanz sieht es wie eine Java-Bean-Klasse aus (wenn das alles ist, was Sie wollen, haben Sie einen Getter und Setter mit einem Standardkonstruktor, der in Ihrer Klasse nicht vorhanden ist, weil ich nicht alle Parameter übergeben möchte) im Konstruktor). Wenn Sie in Zukunft auch eine 4-5 Variable hinzufügen möchten, wird Ihr Code zerbrechen, da Sie Ihren Konstruktor ändern müssen, was vermieden werden kann.

Zweitens, dann fügen Sie endgültig zu der Variablen hinzu und eliminieren die Setter, die in die Richtung führen, in der Sie eine veränderbare Klasse erstellen möchten. In diesem Fall sollten Sie Ihre Klasse als endgültig definieren.

Betrachten Sie Builder-Muster, wenn Gesicht mit so vielen Parametern im Konstruktor ist.

Außerdem sollten Sie keine Setter-Eigenschaft für die ID zulassen. Erstellen Sie stattdessen eine neue Instanz mit einem neuen ID-Wert. So funktioniert die Mutabilität und wird gut sein, um neue Fehler zu vermeiden.

1

Das Builder-Muster ist nicht dazu gedacht, verwendet zu werden, wenn man (einzelne) Attribute eines Objekts ändern möchte.

Builder Muster löst das Problem mit der großen Anzahl von optionalen Parametern und inkonsistenten Zustand durch einen Weg, um das Objekt Schritt-für-Schritt und stellen ein Verfahren zu erstellen, die tatsächlich die Endobjekt wird zurückkehren. source: JournalDev

Wenn Sie wollen einfach nur ein einziges Attribut einer vorhandenen Klasse zu aktualisieren, ein setter verwendet, ist völlig in Ordnung, das ist, was sie sind für, eigentlich.

Es ist schwer zu beurteilen, ob es sinnvoll ist, die ID dieses Objekts zu ändern, ohne den Kontext Ihrer Anwendung zu kennen. Das Erstellen eines neuen Objekts mit einer neuen ID könnte ebenfalls eine Option sein.

Verwandte Themen