java.lang.Object
cn.wjybxx.base.ConstantPool<T>
常量池
A:
一些技巧
Q: 如何不影响性能的情况下获得size?A:
private static class SizeHolder {
private static final int SIZE = POOL.size();
}
内部类是必要的,这可以保证外部类加载完成在内部类之前,确保所有的常量实例创建完成之后才获取values。
(大多数技巧都依赖于此)
Q: 如何根据id获取常量? A: 仍然需要借助内部类,在内部类中获取values,然后建立映射即可。
- 作者:
- wjybxx date 2023/4/1
-
方法概要
修饰符和类型方法说明final booleanfinal T获取一个常量,若不存在关联的常量则返回null。final TgetOrThrow(String name) 获取一个常量,若不存在关联的常量则抛出异常final ConstantMap<T> 创建一个当前常量池的快照final TnewInstance(Constant.Builder builder) 创建一个常量,如果已存在关联的常量,则抛出异常。final TnewInstance(String name) 创建一个常量,如果已存在关联的常量,则抛出异常。static <T extends Constant>
ConstantPool<T> newPool(ConstantFactory<? extends T> factory) static <T extends Constant>
ConstantPool<T> newPool(ConstantFactory<? extends T> factory, int firstId) final intsize()final T获取给定名字对应的常量。values()注意: 1.该操作是个高开销的操作。
-
方法详细资料
-
newPool
-
newPool
public static <T extends Constant> ConstantPool<T> newPool(ConstantFactory<? extends T> factory, int firstId) - 参数:
factory- 可通过基础的Builder构建常量的工厂,通常是无额外数据的简单常量对象,factory通常是构造方法引用firstId- 第一个常量的id,如果常量的创建是无竞争的,那么id将是连续的
-
valueOf
获取给定名字对应的常量。 1.如果给定的常量存在,则返回存在的常量。 2.如果关联的常量不存在,但可以默认创建,则创建一个新的常量并返回,否则抛出异常。 -
newInstance
创建一个常量,如果已存在关联的常量,则抛出异常。 -
newInstance
创建一个常量,如果已存在关联的常量,则抛出异常。- 参数:
builder- 构建常量需要的数据--请确保创建的对象仍然是不可变的。
-
exists
- 返回:
- 如果给定名字存在关联的常量,则返回true
-
get
获取一个常量,若不存在关联的常量则返回null。- 返回:
- 返回常量名关联的常量,若不存在则返回null。
-
getOrThrow
获取一个常量,若不存在关联的常量则抛出异常- 参数:
name- 常量的名字- 返回:
- 常量名关联的常量
- 抛出:
IllegalArgumentException- 如果不存在对应的常量
-
values
注意: 1.该操作是个高开销的操作。 2.如果存在竞态条件,那么每次返回的结果可能并不一致。 3.返回值是当前数据的一个快照 4.默认我们是按照声明顺序排序的- 返回:
- 返回当前拥有的所有常量
-
size
public final int size()- 返回:
- 常量池的大小
-
newConstantMap
创建一个当前常量池的快照
-