21

オーバーロードされたコンストラクター(デフォルトとparamsを持つもの)を持つ顧客クラスがある場合、オーバーロードされたコンストラクターでクラスメンバーを設定する適切な方法は何ですか?「this」参照を使用しますか、それともセッターメソッドを使用しますか?

適切な方法が何であるかがわかりませんでした。

public class Customer {

private String firstName;
private String lastName;
private int age;

public Customer() {}

//This Way
public Customer(String firstName, String lastName, int age)
{
    this.firstName = firstName;
    this.lastName = lastName;
    this.age = age;
}

// Or this way?
  public Customer(String firstName, String lastName, int age)
{
    setFirstName(firstName); 
    setLastName(lastName);
    setAge(age);
}



/**
 * @return the firstName
 */
public String getFirstName() {
    return firstName;
}

/**
 * @param firstName the firstName to set
 */
public void setFirstName(String firstName) {
    this.firstName = firstName;
}

/**
 * @return the lastName
 */
public String getLastName() {
    return lastName;
}

/**
 * @param lastName the lastName to set
 */
public void setLastName(String lastName) {
    this.lastName = lastName;
}

/**
 * @return the age
 */
public int getAge() {
    return age;
}

/**
 * @param age the age to set
 */
public void setAge(int age) {
    this.age = age;
}

}

4

6 に答える 6

27

最初のもの(を使用this.)は、おそらくより安全で簡単です。将来のサブクラスがsetterメソッドを上書きするかどうかを検討してください。これにより、非常に予期しない動作が発生する可能性があります。

あなたのクラスが最終的なものである場合、これは無関係であり、それは洗浄です。

于 2012-09-07T20:16:36.593 に答える
2

それはどちらがそれを行うためのより良い方法であるかではなく、あなたがそれから何を望んでいるかについてではありません......

-クラスをにしたい場合はmutable、を使用してくださいsetters

-クラスを希望する場合は、を使用する方が良いオプションImmutableだと思います。this

thisを使用するのは、Webサーバーまたはソースからデータを受け取り、それらをカスタムクラスのインスタンスの形式でコレクションに格納する場所で適切だと思います。

例えば:

  • クラスの生徒を作成し、

  • Webサービスにリクエストを送信すると、次のような応答が返されます JSON。...

  • それを解析してから、Studentのインスタンスを作成し、コレクションに保存します。

    例えば:

    ArrayList<Student> arList = new ArrayList<Student>();

    arList.add(new Student(name,rollNos,class,marks));

于 2012-09-07T20:25:57.907 に答える
1

最良の答えは「依存する」でしょう。通常、セッターが値を設定する前に計算のようなことをしない限り、セッターを使用する必要はありません。ただし、セッターが値を直接設定するだけの場合thisは、おそらく最適です。それどころか、セッターは検証などに使用されます。使用すると、セッターをthis見逃してしまいます。

于 2012-09-07T20:18:34.887 に答える
0

すでに述べたように、コンストラクターでオーバーライド可能なメソッドを呼び出すことは非常に危険です。ただし、セッターで行われるある種の検証を実行する必要がある場合でも、それを達成するためのいくつかの賢明な方法があります。

  1. セッターをファイナルにします。最速のソリューション。これはすでに述べられていますが、それが唯一の選択肢ではありません。
  2. セッターのプライベートコピーを使用します。
  3. コンストラクターの代わりにファクトリメソッドを使用します。私は通常これに固執します。このようにすると、検証が失敗した場合に状況をより自由に処理でき、(2)よりも意図をより適切に伝達できるためです。
于 2012-09-07T21:16:35.107 に答える
0

基本的に、検証以外の違いはありません。

一方では、セッターが新しい値のみに基づいて新しい値を検証する場合(オブジェクトの状態に依存しない)、セッターを呼び出すことで検証ロジックの重複を回避できます。

一方、1つのセッターの検証で他のプロパティをチェックする場合は、そのセッターを呼び出す前に必要なプロパティが既に設定されていることを確認するか、プロパティを直接割り当てる必要があります。

于 2012-09-07T20:16:00.163 に答える
0

直接アクセスの方法は高速です(メモリが正しく機能する場合は7倍高速です)が、これらの値の割り当てまたは割り当ての連鎖(別のセッターから2番目のフィールドを割り当てる場合)に特別なルールがある場合は、2番目の方法の方が「安全」です。アクセサーに実装されている場合、つまり、コンストラクターから割り当てが行われるときに、もちろんこれらのルール/チェーンを明示的にバイパスしたい場合を除きます。

要するに、それはあなたのニーズに依存しますが、それが私が考えることができる主な懸念事項です。

于 2012-09-07T20:17:39.303 に答える