Java - 在重载的构造函数调用中创建 HashMap
Java - create HashMap in overloaded constructor call
我有一个非常简单的问题,但到目前为止找不到任何问题。
我正在尝试创建两个 class 构造函数。
第一个构造函数获取 2 个字符串和一个 HashMap 并初始化 class 变量。
public Foo(String a, String b, HashMap<String, String> c) {
this.a = a;
this.b = b;
this.c = c;
}
第二个构造函数应该只获取 2 个字符串并创建一个 "default"-HashMap。
通常你只需调用 this()
并使用默认值,但我找不到使用 HashMap
.
的方法
public Foo(String a, String b) {
this(a, b, new HashMap<String, String>().put("x", "y").put("f","g"));
}
Eclipse 标记错误:
Type mismatch: cannot convert from String
to HashMap<String,String>
否则 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);
}
有什么解决办法吗?
最坏的情况我不得不复制代码,但我想知道是否没有更好的方法。
如果这个 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;
}
}
HashMap
方法 .put
returns 一个 String
所以当你在你的 2 参数构造函数中调用 3 参数构造函数时你传递了一个 String
。
不需要创建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>())
将新的 HashMap
分配给 c
在 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());;
}
你可以这样做:
public Foo(String a, String b) {
this(a, b, new HashMap<String, String>(){
{
put("x", "y");
put("f", "g");
}
});
}
它创建匿名class继承HashMap并定义带有放置值的init块。
您可以通过添加创建默认 Map
实例的 static 方法来解决 "call to this() must be the first statement":
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()
必须是静态的,因为此时您可能无法访问半构建的实例。
我有一个非常简单的问题,但到目前为止找不到任何问题。
我正在尝试创建两个 class 构造函数。
第一个构造函数获取 2 个字符串和一个 HashMap 并初始化 class 变量。
public Foo(String a, String b, HashMap<String, String> c) {
this.a = a;
this.b = b;
this.c = c;
}
第二个构造函数应该只获取 2 个字符串并创建一个 "default"-HashMap。
通常你只需调用 this()
并使用默认值,但我找不到使用 HashMap
.
public Foo(String a, String b) {
this(a, b, new HashMap<String, String>().put("x", "y").put("f","g"));
}
Eclipse 标记错误:
Type mismatch: cannot convert from
String
toHashMap<String,String>
否则 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);
}
有什么解决办法吗?
最坏的情况我不得不复制代码,但我想知道是否没有更好的方法。
如果这个 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;
}
}
HashMap
方法 .put
returns 一个 String
所以当你在你的 2 参数构造函数中调用 3 参数构造函数时你传递了一个 String
。
不需要创建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>())
将新的 HashMap
分配给 c
在 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());;
}
你可以这样做:
public Foo(String a, String b) {
this(a, b, new HashMap<String, String>(){
{
put("x", "y");
put("f", "g");
}
});
}
它创建匿名class继承HashMap并定义带有放置值的init块。
您可以通过添加创建默认 Map
实例的 static 方法来解决 "call to this() must be the first statement":
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()
必须是静态的,因为此时您可能无法访问半构建的实例。