• Java编程技巧-定义集合常量、定义数组常量的最佳方式


    场景

    Java中定义集合常量的最佳方式

    在编码中,经常使用到各种集合常量,比如List(列表)常量、Set(集合)常量、Map(映射)常量等。

    普通方式一般这样写:

    1.     public static final List<Integer> CONST_VALUE_LIST = Arrays.asList(1,2,3);
    2.     public static final Set<Integer> CONST_VALUE_SET = new HashSet<>(Arrays.asList(1,2,3));
    3.     public static final Map<Integer,String> CONST_VALUES_MAP;
    4.     static {
    5.         CONST_VALUES_MAP = new HashMap<>();
    6.         CONST_VALUES_MAP.put(1,"a");
    7.         CONST_VALUES_MAP.put(2,"b");
    8.     }

    问题:

    由于普通的集合对象(如ArrayList、HashMap、HashSet等)都是可变集合对象,即便是定义为静态常量,

    也可以通过操作方法进行修改。所以,上面方法定义的集合常量,并不是真正意义上的集合常量。

    其中,Arrays.asList方法生成的内部ArrayList不能执行add/remove/clear方法,但是可以执行set方法,也属于可变集合对象。

    注:

    博客:
    霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主

    最佳方式使用如下

    在JDK中,Collections工具类中提供一套方法,用于把可变集合对象变为不可变

    (不可修改,修改时会抛出UnsupportedOperationException异常)集合对象。所以,可以利用这套方法定义集合静态常量。

    1.     public static final List<Integer> CONST_VALUE_LIST_2 = Collections.unmodifiableList(Arrays.asList(1,2,3));
    2.     public static final Set<Integer> CONST_VALUE_SET_2 = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(1,2,3)));
    3.     public static final Map<Integer,String> CONST_VALUE_MAP_2;
    4.     static {
    5.         CONST_VALUE_MAP_2 = Collections.unmodifiableMap(new HashMap<Integer,String>(){{
    6.             put(1,"a");
    7.             put(2,"b");
    8.         }});
    9.     }

    Java中定义数组常量的最佳方式

    一般定义数组常量,会像下面代码一样,定义一个公有数组常量

    public static final int[] CONST_ARRAY = new int[]{1,2,3};

    但是,可以通过下标修改数组值,导致数组常量的值可变。所以,这种方法定义的数组常量,并不是一个真正意义上的数组常量。

    最佳法“私有数组常量+公有克隆方法”的解决方案。

    如下代码所示:先定义一个私有数组常量,保证不会被外部类使用;在定义一个获取数组常量方法,并返回一个数组常量的克隆值。

    1.     private static final int[] CONST_ARRAY_2 = new int[]{1,2,3};
    2.     public static int[] getConstArray2(){
    3.         return CONST_ARRAY_2.clone();
    4.     }

    由于每次返回的是一个克隆数组,即便修改了克隆数组的常量值,也不会导致原始数组常量值的修改。

  • 相关阅读:
    spring官方文档中文
    【数据结构功法】第4话 · 手把手拉着你入门单链表
    AcWing_第 78 场周赛
    学生体育运动主题网页设计——兵乓球国乒网(纯HTML+CSS代码)
    微服务项目:尚融宝(48)(核心业务流程:借款 审核(3))
    uni-app nvue vue3 setup中实现加载webview,解决nvue中获取不到webview实例的问题
    ubuntu16编译linux源码内核
    【Python】《Python编程:从入门到实践 (第2版) 》笔记-Chapter10-文件和异常
    Pandas数据的导入与导出
    从零搭建云原生技术kubernetes(K8S)环境-通过kubesPhere的AllInOne方式
  • 原文地址:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/131144391