guava之ImmutableList三种初始化方式的使用实例

来源:互联网 发布:mac 中英文切换灯不亮 编辑:程序博客网 时间:2024/06/16 10:09

不可变集合,顾名思义就是说集合是不可被修改的。集合的数据项是在创建的时候提供,并且在整个生命周期中都不可改变。


为什么要用immutable对象?immutable对象有以下的优点:

    1.对不可靠的客户代码库来说,它使用安全,可以在未受信任的类库中安全的使用这些对象
    2.线程安全的:immutable对象在多线程下安全,没有竞态条件
    3.不需要支持可变性, 可以尽量节省空间和时间的开销. 所有的不可变集合实现都比可变集合更加有效的利用内存 (analysis)
    4.可以被使用为一个常量,并且期望在未来也是保持不变的

immutable对象可以很自然地用作常量,因为它们天生就是不可变的对于immutable对象的运用来说,它是一个很好的防御编程(defensive programming)的技术实践。


Immutable集合使用方法:

  一个immutable集合可以有以下几种方式来创建:
  1.用copyOf方法, 譬如, ImmutableSet.copyOf(set)
  2.使用of方法,譬如,ImmutableSet.of("a", "b", "c")或者ImmutableMap.of("a", 1, "b", 2)
  3.使用Builder类  

以这个ImmutableList为例,来看看怎么初始化。

package com.lxk.guavaTest;import com.google.common.collect.ImmutableList;import java.util.List;/** * @author lxk on 2017/11/7 */public interface ConstantList {    /**     * 有时候,我们可能需要在代码里面使用一个包含许多常量的list     * 不可变集合。。。     */    List<String> CONSTANT_LIST =            new ImmutableList.Builder<String>()                    .add("平均值")                    .add("总值")                    .add("最大值")                    .add("最小值")                    .build();    /*     * 推荐使用上面的写法,样式好看,且好维护,也就是说,你现在要删除或者添加一条,直接添加一行就好。常量整体也看着条理清晰。     */    //List<String> CONSTANT_LIST = ImmutableList.of("平均值","总值","最大值","最小值");    //List<String> CONSTANT_LIST = ImmutableList.copyOf(Lists.newArrayList("平均值","总值","最大值","最小值"));}

因为是当常量集合使用的,所以说,就得单独放在某个单独的文件里面。

package com.lxk.guavaTest;/** * guava ImmutableMap 测试实例 * * @author lxk on 2017/11/7 */public class ImmutableListTest {    public static void main(String[] args) {        String string = "最大值";        if (ConstantList.CONSTANT_LIST.contains(string)) {            System.out.println("常量list集合包含此 String");        }        //此常量list不能add,remove,不然会抛异常的。        //ConstantList.CONSTANT_LIST.add("sss");        //ConstantList.CONSTANT_LIST.remove(string);    }}

其实,就是生成个常量的集合,这个常量 集合略显高级而已。。。具体高级的地方,在文章开头已经介绍过啦。