2016-10-23 3 views
0

Ich habe Klasse Person und ich mag Eingangsdaten die Benutzer wie Vorname bilden, Alter, Geschlecht, Gewicht, etc. (I wantto die Scanner-Klasse verwenden.)Welcher Weg zum Erstellen eines Objekts bei der Dateneingabe?

Wie soll ich mit den Eingabedaten umgehen zu ein Objekt der Klasse Person anlegen? Ich betrachte die folgenden Optionen und möchte wissen, welche zu verwenden.

1) erstellen Person-Objekt mit einem nicht-args Konstruktor an dem START und dann - Eingang ein Stück von Daten (zB Vorname) - die Setzer der Person verwendet diese Daten in dem zuvor genannten Ziel zu setzen - Wiederholen Sie die Schritte für die anderen Daten Am Ende senden Sie das Objekt an eine PersonDAO

Nachteil: Wenn ich einen No-Args-Konstruktor für die Person-Klasse enthalten, erlaube ich die Schaffung eines "leeren" ungültiges Person-Objekt irgendwo anders im Programm. (Ich bin nicht wirklich sicher, ob ich mich wirklich darum kümmern sollte.)

2) Erstellen Sie ein Person-Objekt mit einem Multiparameter-Konstruktor am ENDE. - geben Sie die Daten nacheinander ein und bewahren Sie sie in einem Array/einer Liste/Variablen auf. - Wenn Sie mit der Eingabe fertig sind, extrahieren Sie die Daten aus dem Array/list/variables und erstellen Sie ein Person-Objekt, indem Sie sie in den Konstruktor der Person einfügen (eins mit vielen Parametern). Am Ende senden Sie das Objekt an ein PersonDAO.

Nachteil: Wenn eines der Argumente ungültig ist, werde ich das ziemlich spät erfahren. Das ganze Verfahren sieht komplizierter aus.

Welche Option ist dann besser? Vielleicht gibt es eine andere Möglichkeit, mit Eingabedaten umzugehen, bevor Sie sie an DAO senden ...

Und ich denke, das DAO wird die GETTERS des Objekts verwenden, um einen Datensatz in einer Datenbank zu erstellen?

Antwort

1

Ich empfehle die Verwendung Builder Entwurfsmuster. Es sieht aus wie:

public final class Person { 
    private String firstName; 
    private String lastName; 
    private int age; 

    private Person() {} 

    public String getFirstName() { 
     return firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public int getAge() { 
     return age; 
    } 

    public static Builder newBuilder() { 
     return new Person(). new Builder(); 
    } 

    public class Builder { 
     public Builder setFirstName(String firstName) { 
      //validate concrete params here with RuntimeExceptions 
      Person.this.firstName = firstName; 
      return this; 
     } 

     public Builder setLastName(String lastName) { 
      Person.this.lastName = lastName; 
      return this; 
     } 

     public Builder setAge(int age) { 
      Person.this.age = age; 
      return this; 
     } 

     public Person build() { 
      //validate filling of Person here 
      return Person.this; 
     } 

    } 
} 

So Ihre Klasse:

  • jede Zählung der Initialisierungsparameter haben könnte
  • Validate diese Klasse ist in einer build Methode
  • bereit
  • Klasse
  • unveränderlich worden gekapselter Konstruktor
+0

Würde es einen Unterschied machen, wenn ich den Builder als eine geschachtelte statische Klasse erstellt habe? – enhancedJack

+1

Keine Unterschiede, nur eine weitere Implementierung des Musters. Sie sollten jedoch Felder der Hauptklasse innerhalb des Builders duplizieren, wenn Sie eine geschachtelte Klasse verwenden. Aus diesem Grund bevorzuge ich die Implementierung der inneren Klasse, weil sie flacher ist. – Beloo

+0

Zwei weitere Fragen: 1) Unterbrechen wir nicht die Kapselung der Person-Klasse, wenn der Builder direkten Zugriff auf die Instanzvariablen der Person hat? 2) Mit einem No-Args-Konstruktor müssen wir in die Implementierung der build() -Methode eintauchen, um herauszufinden, was ein gültiges Person-Objekt ausmacht. Ist es in Ordnung? – enhancedJack

Verwandte Themen