严格来讲,map的初始化只包含new的操作。但在这里,因为是包含数据的map,所以我们把map的初始化分两步:
1. new的操作,我们这里称为初步初始化
2. put数据的操作,成为数据填充
两步合起来,称为包含键值对(数据)的map的初始化。
以下给出了这种map初始化的两种方式,我原来都是用第一种方式。第二种方式是今天第一次见,很新颖,也很简洁;全部初始化动作在一条语句内完成。
- 先初步初始化后填充
// 错误信息说明
public final /*static*/ Map<Integer, String> RESULT_MESSAGE = new HashMap<Integer, String>();
/*static*/{//如果不是静态属性,也可以使用构造函数
RESULT_MESSAGE.put(RESULT_CODE_OK, "ok");
RESULT_MESSAGE.put(RESULT_CODE_BADREQUEST, "bad request");
RESULT_MESSAGE.put(RESULT_CODE_UNAUTHORIZED, "unauthorized");
RESULT_MESSAGE.put(RESULT_CODE_FORBIDDEN, "forbidden");
RESULT_MESSAGE.put(RESULT_CODE_TOOMANYREQUEST, "too many request");
RESULT_MESSAGE.put(RESULT_CODE_INTERNALSERVERERROR, "Internal Server Error");
}
- 匿名内部类
// 错误信息说明
public final /*static*/ Map<Integer, String> RESULT_MESSAGE = new HashMap<Integer, String>(){
{
put(RESULT_CODE_OK, "ok");
put(RESULT_CODE_BADREQUEST, "bad request");
put(RESULT_CODE_UNAUTHORIZED, "unauthorized");
put(RESULT_CODE_FORBIDDEN, "forbidden");
put(RESULT_CODE_TOOMANYREQUEST, "too many request");
put(RESULT_CODE_INTERNALSERVERERROR, "Internal Server Error");
}
};
- 那么究竟两种方法各有什么优劣呢?以下是我的思考,不一定正确。
内部类
*优:*map的初始化和数据填充是强行在一体的,代码简洁,阅读性好。
劣:内部类会产生新的class文件,HashMap的子类,虽然是匿名的。所以可能性能并不是太好。我们讲子类一般都是对父类的扩展,在这里子类并没有对父类进行功能性上的扩展(复写),只是在内部填充了数据而已
先初步初始化后填充
优:不会使用子类,用的就是HashMap本身。不产生新的class文件
劣:Map的初步初始化和数据填充两部是分离的,不是被强行绑定在一起的。所以就有可能在初步初始化和数据填充中间夹塞许多代码,不易阅读
建议:建议使用先初步初始化后填充这种方式,因为不会产生新的类型。虽然不是被强行绑定在一起的,但是这是可人为控制的。只要写代码的时候注意一些,两步操作先后紧挨着放在一起,就会好多了