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

时间:2020-12-09 19:42:54

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


为什么要用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);
}
}

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