3

かなり簡単な質問がありましたが、これまでのところ何も見つかりませんでした。

2 つのクラス コンストラクターを作成しようとしています。
最初のコンストラクターは、2 つの String と 1 つの HashMap を取得し、クラス変数を初期化します。

public Foo(String a, String b, HashMap<String, String> c) {
    this.a = a;
    this.b = b;
    this.c = c;
}

2 番目のコンストラクターは、2 つの文字列のみを取得し、「デフォルト」の HashMap を作成する必要があります。

this()通常、内部にデフォルト値を指定して呼び出すだけですが、 HashMap.

public Foo(String a, String b) {
    this(a, b, new HashMap<String, String>().put("x", "y").put("f","g"));
}

Eclipse はエラーをマークします。

String型の不一致: からに変換できませんHashMap<String,String>

そうでなければ、this()-call を関数の最初のステートメントにすることはできません。

public Foo(String a, String b) {
    HashMap<String, String> c = new HashMap<String, String>();
    c.put("x", "y");
    c.put("f", "g");
    this(a, b, c);
}

これを解決する方法はありますか?

最悪の場合、コードを複製する必要がありましたが、他に良い方法はないかと考えていました。

4

5 に答える 5

5

この Map が定数の場合、定数として保存して再利用できます。これにより、新しいマップが作成されるたびにマップを再作成する必要がなくなりますが、マップFooはすべての で共有されますFoo

public class Foo {

    private static final Map<String, String> DEFAULT = new HashMap<>();

    static {
        DEFAULT.put("x", "y");
        DEFAULT.put("f","g");
    }

    public Foo(String a, String b) {
        this(a, b, DEFAULT);
    }

    public Foo(String a, String b, Map<String, String> c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }

}

正しい値を返す静的メソッドを作成することもできます。内でインスタンス メソッドを呼び出すことはできないため、メソッドは静的である必要があることに注意してくださいthis()

public class Foo {

    public Foo(String a, String b) {
        this(a, b, getDefaultMap());
    }

    public Foo(String a, String b, Map<String, String> c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    private static Map<String, String> getDefaultMap() {
        Map<String, String> map = new HashMap<>();
        map.put("x", "y");
        map.put("f", "g");
        return map;
    }

}
于 2015-11-24T13:46:58.160 に答える
4

のローカル変数を作成する必要はありませんc

このように単純に呼び出すことができます。

public Foo(String a, String b) {
    this(a, b, new HashMap<String, String>());
    c.put("x", "y");
    c.put("f", "g");
}

他のコンストラクターは呼び出しメソッドにthis(String, String, HashMap<String, String>()) newHashMapを割り当てるため、これも新しく作成されたものを埋め、提供したデフォルト値を割り当てます。ccHashMap

別の解決策は、静的メソッドを作成して呼び出すことです

public static HashMap<String, String> createDefaultHashMap() {
    HashMap<String, String> c = new HashMap<String, String>();
    c.put("x", "y");
    c.put("f", "g");
    return c;
}

public Foo(String a, String b) {
    this(a, b, Foo.createDefaultHashMap());;
}
于 2015-11-24T13:48:29.807 に答える
1

HashMapメソッド.putは a を返すため、2 引数コンストラクターで 3 引数コンストラクターを呼び出すときにStringa を渡します。String

于 2015-11-24T13:48:26.087 に答える
0

次のようなトリックを実行できます。

public Foo(String a, String b) {
    this(a, b, new HashMap<String, String>(){
       {
           put("x", "y");
           put("f", "g");
       }
    });
}

HashMap を継承した無名クラスを作成し、値を入れて init ブロックを定義します。

于 2015-11-24T13:54:29.103 に答える