模块 wjybxx.base
程序包 cn.wjybxx.base

类 ConstantPool<T extends Constant<T>>

java.lang.Object
cn.wjybxx.base.ConstantPool<T>

public class ConstantPool<T extends Constant<T>> extends Object
常量池

一些技巧

Q: 如何不影响性能的情况下获得size?
A:
 
     private static class SizeHolder {
         private static final int SIZE = POOL.size();
     }
 
 
内部类是必要的,这可以保证外部类加载完成在内部类之前,确保所有的常量实例创建完成之后才获取values。 (大多数技巧都依赖于此)

Q: 如何根据id获取常量?
A: 仍然需要借助内部类,在内部类中获取values,然后建立映射即可。

作者:
wjybxx date 2023/4/1
  • 方法详细资料

    • newPool

      public static <T extends Constant<T>> ConstantPool<T> newPool(ConstantFactory<? extends T> factory)
    • newPool

      public static <T extends Constant<T>> ConstantPool<T> newPool(ConstantFactory<? extends T> factory, int firstId)
      参数:
      factory - 可通过基础的Builder构建常量的工厂,通常是无额外数据的简单常量对象,factory通常是构造方法引用
      firstId - 第一个常量的id,如果常量的创建是无竞争的,那么id将是连续的
    • checkName

      public static String checkName(String name)
      检查name的合法性
    • valueOf

      public final T valueOf(String name)
      获取给定名字对应的常量。 1.如果给定的常量存在,则返回存在的常量。 2.如果关联的常量不存在,但可以默认创建,则创建一个新的常量并返回,否则抛出异常。
    • newInstance

      public final T newInstance(String name)
      创建一个常量,如果已存在关联的常量,则抛出异常。
    • newInstance

      public final T newInstance(Constant.Builder<T> builder)
      创建一个常量,如果已存在关联的常量,则抛出异常。
      参数:
      builder - 构建常量需要的数据--请确保创建的对象仍然是不可变的。
    • exists

      public final boolean exists(String name)
      返回:
      如果给定名字存在关联的常量,则返回true
    • get

      @Nullable public final T get(String name)
      获取一个常量,若不存在关联的常量则返回null。
      返回:
      返回常量名关联的常量,若不存在则返回null。
    • getOrThrow

      public final T getOrThrow(String name)
      获取一个常量,若不存在关联的常量则抛出异常
      参数:
      name - 常量的名字
      返回:
      常量名关联的常量
      抛出:
      IllegalArgumentException - 如果不存在对应的常量
    • values

      public final List<T> values()
      注意: 1.该操作是个高开销的操作。 2.如果存在竞态条件,那么每次返回的结果可能并不一致。 3.返回值是当前数据的一个快照 4.默认我们是按照声明顺序排序的
      返回:
      返回当前拥有的所有常量
    • size

      public final int size()
      返回:
      常量池的大小
    • newConstantMap

      public final ConstantMap<T> newConstantMap()
      创建一个当前常量池的快照