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