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

严格来讲,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的初步初始化和数据填充两部是分离的,不是被强行绑定在一起的。所以就有可能在初步初始化数据填充中间夹塞许多代码,不易阅读

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

猜你喜欢

转载自blog.csdn.net/u013786868/article/details/53261207