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 函数。
相关
- Value - 基类
- ValueSimple / ValueMath / ValueLogic / ValueComplex - 4 个注册方