1

デフォルトのコンストラクタである MyClass() を使用して、クラス MyClass で多くのテストケースを実行しました。

MyClass の要件が変更され、ユーザーは HashMap を提供していくつかのペアを示すことができるようになりました。MyClass は少なくとも 1 つのペアを持つ必要があり、そのうちの 1 つが null の場合は例外をスローします。

すべてのテスト メソッドを次のように書き直す必要がないように、別のデフォルト コンストラクタを作成したいと考えていました。

public MyClass() {

  HashMap<KeyClass, ValueClass> hashMap = HashMap<KeyClass, ValueClass>();
  hashMap.put(KeyClass.someValue, new ValueClass());
  this(hashMap);

}

最初に他のコンストラクターを呼び出す必要があるため、これは機能しません。そのため、いくつかのメソッドを作成することを考えました

private static HashMap<KeyClass, ValueClass> getDefaultHashmap();

それを使用して、次のように他のコンストラクターを呼び出します。

public MyClass() {

  this(MyClass.getDefaultHashmap());

}

しかし、これはあまり良いスタイルではないように思えたので、このようなことを行う正しい方法を教えていただければ幸いです。

4

4 に答える 4

3

HashMap の作成をインライン化できます。

public MyClass() {
    this(new HashMap<KeyClass, ValueClass>() {{
        put(KeyClass.someValue, new ValueClass());
    }});
}

ただし、「きれい」に保つには、シリアル ID の警告を無視する必要があります。

于 2011-04-28T14:12:06.430 に答える
1

私が通常使用するソリューションは次のとおりです。

public MyClass {

  private static Map<KeyClass, ValueClass> newMap() {
     Map<KeyClass, ValueClass> result = new HashMap<KeyClass, ValueClass>();
     result.put(KeyClass.someValue, new ValueClass());
     return result; 
  }

  public MyClass() {
     this(newMap());
  }

  public MyClass(Map<KeyClass, ValueClass> m) { ... }
}

私は -class をサブクラス化するよりもそれを好みますHashMap(@alpian が示唆するように) - よりクリーンに見え、equals() メソッドの契約を破るリスクも生じません (ここで説明: http://c2.com/cgi/ wiki?DoubleBraceInitialization )

于 2011-04-28T14:31:43.690 に答える
1

個人的にはnew HashMap(...)、両方のコンストラクターで a を作成し、新しい静的メソッドで作成をラップしようとはしません。

于 2011-04-28T14:12:39.833 に答える
1

新しい匿名 HashMap サブクラスの作成を避けたい場合、必要なペアは 1 つだけで、新しい静的メソッドを作成したくない場合は、次のようにします。

public MyClass() {
    this(new HashMap<KeyClass, ValueClass>(
        Collections.singletonMap(KeyClass.someValue, new ValueClass())));
}

他のコンストラクターがマップを取得してコピーする場合、HashMap をクレートする必要さえない場合があります。

public MyClass() {
    this(Collections.singletonMap(KeyClass.someValue, new ValueClass()));
}
于 2011-04-28T17:57:02.370 に答える