包含键值对的Map属性的初始化方式

来源:互联网 发布:女神联盟2英雄进阶数据 编辑:程序博客网 时间:2024/05/22 13:10

严格来讲,map的初始化只包含new的操作。但在这里,因为是包含数据的map,所以我们把map的初始化分两步:
1. new的操作,我们这里称为初步初始化
2. put数据的操作,成为数据填充
两步合起来,称为包含键值对(数据)的map的初始化。

  • 以下给出了这种map初始化的两种方式,我原来都是用第一种方式。第二种方式是今天第一次见,很新颖,也很简洁;全部初始化动作在一条语句内完成。

    1. 先初步初始化后填充
    // 错误信息说明    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");    }
  1. 匿名内部类
    // 错误信息说明    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的初步初始化和数据填充两部是分离的,不是被强行绑定在一起的。所以就有可能在初步初始化数据填充中间夹塞许多代码,不易阅读

建议:建议使用先初步初始化后填充这种方式,因为不会产生新的类型。虽然不是被强行绑定在一起的,但是这是可人为控制的。只要写代码的时候注意一些,两步操作先后紧挨着放在一起,就会好多了

0 0