我正在编写一些代码,其中我有一个扩展HashMap的自定义HashMap类。
自定义HashMap类
public class CaseInsensitiveMap<T> extends HashMap<String, T> {
/**
*
*/
private static final long serialVersionUID = 1L;
public T put(String key, T value) {
return super.put(key.toLowerCase(), value);
}
public T get(String key) {
return super.get(key.toLowerCase());
}
}
我的枚举将类创建为查找并放置所有值。 put语句无法正常工作,因为它会覆盖值,而值不会填充HashMap表,而是跳过索引。
枚举
public enum UpdateMode{
/**
* No auto-updates or update notifications will occur. Updates can be performed manually.
*/
UNAVAILABLE("UNAVAILABLE", false),
/**
* Updates are enabled and the driver will be notified only once per session.
*/
AVAILABLE("AVAILABLE", true),
/**
* The device will be forced to update with no user notification.
*/
MANDATORY("MANDATORY", true);
private final String code;
private final boolean isAutomatic;
private UpdateMode(String code, boolean isAutomatic)
{
this.code = code;
this.isAutomatic = isAutomatic;
}
//private static final CaseInsensitiveMap<UpdateMode> lookup = new CaseInsensitiveMap<UpdateMode>();
private static final HashMap<String, UpdateMode> lookup = new HashMap<String, UpdateMode>();
static {
for (final UpdateMode t : UpdateMode.values()) {
lookup.put(t.code(), t);
}
}
/**
* Gets the enum from the supplied code string value.
* @param code
* @return
*/
public static UpdateMode get(String code) {
if (lookup.containsKey(StringUtil.nullToEmptyString(code))) {
return lookup.get(code);
}
return AVAILABLE;
}
/**
* Returns the code value of the UpdateModes ("UNAVAILABLE", "AVAILABLE", "MANDATORY")
* @return
*/
public String code()
{
return code;
}
/**
* Checks if update features are automatic.
*
* @return true, if is automatic
*/
public boolean isAutomatic() {
return isAutomatic;
}
}
这会失败,因为在使用Custom HashMap类时,找不到“UpdateMode”,因为该值已被另一个字符串值替换。
// Automated updates have been disabled.
if (!updateServiceContext.getUpdateMode().isAutomatic())
{
return;
}
当我直接使用HashMap时,一切都按预期工作,HashMap表填充了我的所有值。为什么我的自定义HashMap类没有正确填充put?
HashMap表中值的图片。注意使用自定义HashMap类与直接使用HashMap时的区别。并非所有看跌期权值都存在,表格中存在差距。
扩展HashMap的自定义HashMap类
Java HashMap
答案 0 :(得分:1)
最佳猜测:在getUpdateMode()
中,地图的声明类型有一些超类,而不是CaseInsensitiveMap
,或者传递给get()
的值未声明为{{ 1}}。在任何一种情况下,它都将调用String
HashMap
版本的get()
,而不是你的覆盖,它不会小写字符串因此失败,因为当存储的密钥为{{时它正在寻找"UpdateMode"
1}}。
这是因为您覆盖"updatemode"
实际上不是覆盖,因为它声明的参数类型不同。 get()
被声明为Map.get()
,而不是Object
,并且对其进行任何覆盖必须执行相同操作。将您的K
覆盖更改为:
get()
如果您在每个覆盖上都使用了public T get(Object key) {
if (!(key instanceof String)) {
return null;
}
return super.get(((String) key).toLowerCase());
}
注释,那么您可能会收到编译器警告,告诉您这一点。