接上篇:https://developer.aliyun.com/article/1228115?spm=a2c6h.13148508.setting.33.21084f0eNCKPti
五、 定义集合常量
在编码中,经常使用到各种集合常量,比如List(列表)常量、Set(集合)常量、Map(映射)常量等。
1. 普通定义方式
1) 定义代码
最简单的方法,就是直接定义一个普通的集合常量。
2) 使用代码
使用也很方便,直接通过“类名.常量名”使用。
2. 存在主要问题
通过SonarLint插件扫描,会出现以下问题:
由于普通的集合对象(如ArrayList、HashMap、HashSet等)都是可变集合对象,即便是定义为静态常量,也可以通过操作方法进行修改。所以,上面方法定义的集合常量,并不是真正意义上的集合常量。其中,Arrays.asList方法生成的内部ArrayList不能执行add/remove/clear方法,但是可以执行方法,也属于可变集合对象。
3. 最佳定义方式
在JDK中,Collections工具类中提供一套方法,用于把可变集合对象变为不可变(不可修改,修改时会抛出UnsupportedOperationException异常)集合对象。所以,可以利用这套方法定义集合静态常量。
六、 定义数组常量
上一章介绍了如何定义集合常量,这一章就来介绍一下如何定义数组常量。
1. 定义公有数组常量
1) 定义代码
一般人定义数组常量,就会像下面代码一样,定义一个公有数组常量。
2) 使用代码
使用也很方便,直接通过“类名.常量名”使用。
3) 存在问题
但是,可以通过下标修改数组值,导致数组常量的值可变。所以,这种方法定义的数组常量,并不是一个真正意义上的数组常量。
2. 定义公有集合常量
1) 定义代码
可以通过上一章定义集合常量的方法,返回一个公有集合常量。
2) 使用代码
要想得到数组常量,就把集合常量转化为数组常量。
3) 存在问题
每一次都会把集合常量转化为数组常量,导致程序运行效率降低。
3. 最佳定义方式
最佳法“私有数组常量+公有克隆方法”的解决方案。如下代码所示:先定义一个私有数组常量,保证不会被外部类使用;在定义一个获取数组常量方法,并返回一个数组常量的克隆值。
1) 定义代码
这里,提供一个“私有数组常量+公有克隆方法”的解决方案。如下代码所示:先定义一个私有数组常量,保证不会被外部类使用;在定义一个获取数组常量方法,并返回一个数组常量的克隆值。
2) 使用代码
由于每次返回的是一个克隆数组,即便修改了克隆数组的常量值,也不会导致原始数组常量值的修改。
接下篇:https://developer.aliyun.com/article/1228113?groupCode=java