ValueSimple
str / num / var / invalid
基本信息
| 属性 | 值 |
|---|---|
| 路径 | com.github.lunatrius.ingameinfo.value.ValueSimple |
| 行数 | 92 |
| 注册函数数 | 4 |
4 个已注册函数
| 名 | 内部类 | 类型标识 | 用途 |
|---|---|---|---|
str |
ValueString |
str |
字面文本(会做变量替换) |
num |
ValueNumber |
num |
数字字面量 |
var |
ValueVariable |
var |
引用另一个 tag |
invalid |
ValueInvalid |
invalid |
解析失败占位 |
这 4 个是配置文件里出现频率最高的名字。默认配置
assets/ingameinfo/InGameInfo.xml 里 <str> / <num> / <var>
三种标签各占大量篇幅。
本类的两个覆写(:8-33)
public Value setRawValue(String value, boolean isText) { ... } // :8
public String getRawValue(boolean isText) { ... } // :17
public boolean isSimple() { return true; } // :26
public boolean isValidSize() { return true; } // :31
isSimple() == true 意味着无子节点,解析器会把它当叶子处理
(XmlParser 的 getValues 靠这个决定是否递归)。
四个内部类
ValueString(:35-49)
getValue() 返回 replaceVariables(this.value) ——
唯一会做 tag 变量替换的基础类型。
ValueNumber(:51-57)
getValue() 返回原始字符串(不做变量替换)。
数字字面量不需要替换,替换反而会让 { 参与算术运算导致混乱。
ValueVariable(:59-65)
getValue() 走 tag 引用路径 —— 配置里 <var>daytime</var>
即引用 TagPlayerGeneral 的 daytime tag。
⚠️ 实现上它复用 ValueString 的替换逻辑(同一个 replaceVariables),
所以 {...} 嵌在 <var> 里也能工作。
ValueInvalid(:67-83)—— 注意继承关系
public static class ValueInvalid extends ValueComplex { // :67 ← 不是 ValueSimple!
⚠️ ValueInvalid 继承的是 ValueComplex 而不是 ValueSimple,
尽管它定义在本文件里。这不是笔误的推测 ——
ValueRegistry 的 forName 失败时
return new ValueSimple.ValueInvalid(),
而 classStringMap 存的是 value.getClass(),
所以 forClass(ValueInvalid.class) 会正确返回 "invalid"。
但这意味着 invalid 是个复杂 value(isSimple() == false),
解析器会尝试给它挂子节点 —— 与「无效值」的语义不符。
覆写:
| 方法 | 实现 |
|---|---|
isValidSize() |
返回 false(:70) |
getValue() |
返回空串(:75) |
isValid() |
返回 false(:80) |
⚠️ 它没有覆写 isSimple(),所以继承 ValueComplex 的 false。
register(:85-91)—— 含别名
register(new ValueString().setName("str").setAliases("string"));
register(new ValueNumber().setName("num").setAliases("number", "int", "integer", "float", "double"));
register(new ValueVariable().setName("var").setAliases("variable"));
register(new ValueInvalid().setName("invalid"));
| 主名 | 别名 |
|---|---|
str |
string |
num |
number、int、integer、float、double(5 个) |
var |
variable |
invalid |
无 |
⚠️ num 的别名把整数与浮点类型名都映射到同一个实现 ——
int / integer / float / double 四个名字背后是完全相同的
ValueNumber,不做整数/浮点区分(内部用 Double.parseDouble)。
注册顺序与 classStringMap
ValueRegistry 的 init() 顺序是
Complex → Logic → Math → Simple,
所以 invalid 是最后注册的。
ValueInvalid 继承 ValueComplex,但
classStringMap 用的是 Map.get(clazz) 精确类匹配(forClass,:63-66),
不是 isAssignableFrom。所以:
- 9 个
ValueComplex子类各自有精确条目(op/concat/max/ …)→ 正常 ValueInvalid.class有自己的条目"invalid"→ 正常- 但任何未显式注册的
ValueComplex子类,forClass会返回兜底"invalid"—— 与「它就是 invalid」无法区分
ValueComplex.register() 的 9 个函数里 6 个带别名
(见 ValueComplex),别名不写 classStringMap,
所以主名始终是反查结果。
相关
- Value - 基类
- ValueRegistry - 注册处
- ValueComplex -
ValueInvalid的真实父类