2016-10-23 14 views
0

私は、入力データを扱う必要がありますどのように(私はScannerクラスを使用しwantto。)最初の名前、年齢、性別、体重などのようにユーザーを形成データの入力時にオブジェクトを作成する方法は?

私はクラスPersonを持っていると私は入力データにしたいですPersonクラスのオブジェクトを作成しますか? 以下のオプションを検討し、どのオプションを使用するかを知りたいと思います。

1)STARTで引数なしのコンストラクタを持つPersonオブジェクトを作成し、 - データの入力ONE PIECE(例えば最初の名前) - 上記の目的 にこのデータを設定するために、人のセッターを使います - 他のデータのステップを繰り返します。 最後にオブジェクトをPersonDAOに送信

短所:Personクラスの引数なしのコンストラクタを含めると、無効なPersonオブジェクトは、プログラム内の他の場所にあります。

2)マルチパラメータのコンストラクタを持つPersonオブジェクトをENDに作成します(これは本当に心配すべきかどうかはわかりません)。 - 最初にデータを1つずつ入力し、配列/リスト/変数に保持します。 - 入力が完了したら、配列/リスト/変数からデータの部分を抽出し、それらをPersonのコンストラクタに入れてPersonオブジェクトを作成します(多くのパラメータを持つもの) 最後にオブジェクトをPersonDAOに送ります。

欠点:いずれかの引数が無効な場合、私はそのことについてかなり遅れて学習します。全体の手順はより複雑に見えます。

どちらのオプションが優れていますか? DAOに送る前に入力データを扱う他の方法があるかもしれません...

DAOはオブジェクトのGETTERSを使用してデータベースにレコードを作成しますか?

答えて

1

ビルダーデザインパターンを使用することをお勧めします。だからあなたのクラス

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; 
     } 

    } 
} 

  • 初期化パラメータの任意の数
  • は、そのクラスを検証するかもしれないが
  • 不変となっbuild方法
  • クラス内部の準備ができている それは次のようになりますカプセル化コンストラクタ
+0

Builderを入れ子にした静的クラスとして作成しても差はありますか? – enhancedJack

+1

違いはなく、パターンのもう一つの実装です。しかし、ネストされたクラスを使用する場合、メインクラスのビルダーのフィールドを複製する必要があります。そのため、内部クラスの実装を優先します。 – Beloo

+0

さらに2つの質問 1)BuilderがPersonのインスタンス変数に直接アクセスできる場合、Personクラスのカプセル化を解除しないでください。 2)引数なしのコンストラクタでは、build()メソッドの実装に没頭して、有効なPersonオブジェクトを作成する方法を見つけなければなりません。問題無いですか? – enhancedJack

関連する問題