ValueRegistry

31 个 value 函数的注册表

基本信息

属性 值
路径 com.github.lunatrius.ingameinfo.value.registry.ValueRegistry
行数 74
单例 public static final ValueRegistry INSTANCE(:15)

三张表

private final Map<String, Value>                       stringValueMap;  // :17
private final Map<String, Class<? extends Value>>      stringClassMap;  // :18
private final Map<Class<? extends Value>, String>      classStringMap;  // :19

比 TagRegistry 多两张:

  • stringValueMap:名 → 单例实例(用于 forName 之外的取值)
  • stringClassMap:名 → 类(用于反射新建)
  • classStringMap:类 → 名(用于 forClass / getType)

⚠️ stringValueMap 在本 mod 内只被 register 写入,没有任何读取点 (forName 走 stringClassMap)。它是一张只写表。

isAlias 的作用(:21-37)

private void register(String name, Value value, boolean isAlias) {
    if (this.stringValueMap.containsKey(name)) { logger.error("Duplicate value key '" + name + "'!"); return; }
    if (name == null) { logger.error("Value name cannot be null!"); return; }
    this.stringValueMap.put(name.toLowerCase(), value);
    this.stringClassMap.put(name.toLowerCase(), value.getClass());
    if (!isAlias) { this.classStringMap.put(value.getClass(), name.toLowerCase()); }
}

别名不写 classStringMap(:34-36)—— 因为同一实例的多个名字里,只有主名能作为「类 → 名」的反查结果, 否则别名会覆盖主名。

⚠️ 判重用的键大小写不一致:containsKey(name) 查的是已小写化的表, 传入的却是未小写的 name(:22 vs :32)。 所以 Str 与 str 都能注册成功而不触发重复告警,后者静默覆盖前者。 这与 TagRegistry 是同一个缺陷。

实际影响:31 个内置 value 名全为小写,所以不会触发。

forName(:47-61)—— 反射新建

name = name.toLowerCase();
final Class<? extends Value> clazz = this.stringClassMap.get(name);
if (clazz != null) return clazz.getDeclaredConstructor().newInstance();
  • 用 getDeclaredConstructor().newInstance() 每次新建实例, 所以 value 实例是 per-使用点的,不是共享单例
  • ⚠️ 用了 getDeclaredConstructor(),若某 value 类是非静态内部类, 没有无参构造器,会抛 NoSuchMethodException → 返回 ValueInvalid
  • 两条失败路径都返回 new ValueSimple.ValueInvalid() 并 logger.error

forClass(:63-66)

final String str = this.classStringMap.get(clazz);
return str != null ? str : "invalid";

未注册时返回字面量 "invalid" —— 而 "invalid" 恰好就是 ValueSimple.ValueInvalid 的注册名(见 ValueSimple)。 所以这条兜底不会产生歧义,但也没有区分「未注册」与「就是 invalid」。

init(:68-73)

ValueComplex.register();  ValueLogic.register();  ValueMath.register();  ValueSimple.register();

4 个类共 31 个函数,注册顺序 Complex → Logic → Math → Simple (与 TagRegistry 的字母序相反)。

⚠️ 与 tag 侧不同,这里 init() 不打日志, 无法从日志确认注册了多少个 value 函数。

相关