Java-在重载构造函数调用中创建HashMap

Java-在重载构造函数调用中创建HashMap,java,hashmap,overloading,constructor-overloading,Java,Hashmap,Overloading,Constructor Overloading,我有一个很简单的问题,但到目前为止什么也找不到 我正在尝试创建两个类构造函数。 第一个构造函数获取2个字符串和一个HashMap,并初始化类变量 public Foo(String a, String b, HashMap<String, String> c) { this.a = a; this.b = b; this.c = c; } Eclipse标记了一个错误: 类型不匹配:无法从String转换为HashMap 否则,this()-调用不能是函数中

我有一个很简单的问题,但到目前为止什么也找不到

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

public Foo(String a, String b, HashMap<String, String> c) {
    this.a = a;
    this.b = b;
    this.c = c;
}
Eclipse标记了一个错误:

类型不匹配:无法从
String
转换为
HashMap

否则,
this()
-调用不能是函数中的第一条语句

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);
}
public Foo(字符串a、字符串b){
HashMap c=新的HashMap();
c、 放置(“x”、“y”);
c、 付诸表决(“f”、“g”);
这(a,b,c);
}
有什么办法解决这个问题吗


最糟糕的情况是我不得不复制代码,但我想知道是否有更好的方法。

如果这个映射是一个常量,您可以将它存储为常量并重用它。这避免了在每次创建新的
Foo
时重新创建地图,但随后会在所有
Foo
s中共享地图

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

}

HashMap
方法
.put
返回一个
字符串
,因此在调用2参数构造函数中的3参数构造函数时,传递一个
字符串

无需创建
c
的局部变量

你可以这样简单地称呼它

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

你可以这样做:

public Foo(String a, String b) {
    this(a, b, new HashMap<String, String>(){
       {
           put("x", "y");
           put("f", "g");
       }
    });
}
public Foo(字符串a、字符串b){
这(a,b,newhashmap(){
{
放置(“x”、“y”);
付诸表决(“f”、“g”);
}
});
}
它创建了一个匿名类,该类继承HashMap,并使用Puting值定义init块。

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

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;
}
public Foo(字符串a、字符串b){
这(a,b,createDefaultMap());
}
私有静态映射createDefaultMap(){
Map defaultMap=newhashmap();
defaultMap.put(“x”、“y”);
defaultMap.put(“f”、“g”);
返回默认地图;
}

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

您对
c
的引用仍然相同。您可以简单地使用
this(a,b,newhashmap())
作为您的第一条语句,继续使用
c
。Map的put返回当前值(V)。因此,您会得到类型不匹配。这称为双大括号初始化,但我不确定是否推荐它。是的,但请注意,它创建了一个匿名内部类。更多信息。
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());;
}
public Foo(String a, String b) {
    this(a, b, new HashMap<String, String>(){
       {
           put("x", "y");
           put("f", "g");
       }
    });
}
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;
}