3

我有一个非常简单的问题,但到目前为止找不到任何东西。

我正在尝试创建两个类构造函数。
第一个构造函数获取 2 个字符串和一个 HashMap 并初始化类变量。

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

第二个构造函数应该只获取 2 个字符串并创建一个“默认”-HashMap。

通常你只是this()用里面的默认值调用,但我找不到用HashMap.

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

Eclipse 标记一个错误:

类型不匹配:无法转换StringHashMap<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 是一个常量,您可以将其存储为常量并重用它。这避免了每次创建新的 Map 时重新Foo创建,但随后在所有Foos 之间共享。

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>()) 会将 new 分配HashMapc调用方法,c因此也将填充这个新创建HashMap的并将分配您确实提供给它的默认值。

另一种解决方案可能是创建一个静态方法并调用它

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 参数构造函数时String传递了 a 。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 回答
0

您可以通过添加创建默认实例的静态方法来解决“调用 this() 必须是第一条语句” :Map

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

private static Map<String, String> createDefaultMap() {
    Map<String, String> defaultMap = new HashMap<String, String>();
    defaultMap.put("x", "y");
    defaultMap.put("f", "g");

    return defaultMap;
}

必须createDefaultMap()是静态的,因为此时您可能无法访问半构建的实例。

于 2015-11-24T14:02:18.070 回答