Operation
格式化操作枚举
基本信息
| 属性 | 值 |
|---|---|
| 路径 | com.github.lunatrius.ingameinfo.value.Operation |
| 行数 | 144 |
| 类型 | enum,7 个常量 |
| 公开数组 | public static final Operation[] VALUES = values();(:131) |
7 个常量
| 常量 | 行 | 语义 |
|---|---|---|
INVALID |
:5 |
兜底,返回字面量 "null" |
GT |
:12 |
base > operand |
LT |
:28 |
base < operand |
GE |
:44 |
base >= operand |
LE |
:60 |
base <= operand |
EQ |
:76 |
base == operand |
NE |
:103 |
base != operand |
⚠️ 6 个比较常量(GT/LT/GE/LE/EQ/NE)不是颜色或文本操作 ——
它们是多路分支选择器,即把 ValueLogic 的 if
从三元扩展成「n 路」的形式。
⚠️ 常量用大写下划线-free 的双字母缩写(GT 而非 GREATER_THAN),
与本 mod 其他枚举的命名风格(Alignment 的
TOPLEFT、MessageSeed 的
Side.CLIENT)不同。
比较逻辑的分支结构
6 个比较常量共享同一套骨架(以 GT 的 :15-26 为例):
int size = value.values.size();
int operandCount = (size - 2) / 2; // 前提:第 0 个子节点是操作名
double base = value.getDoubleValue(1); // 第 1 个是基准值
for (int i = 2; i < 2 + operandCount; i++) {
double operand = value.getDoubleValue(i);
if (base > operand) {
return value.getValue(operandCount + i); // 命中 → 取对应的结果节点
}
}
return size % 2 == 0 ? "" : value.getValue(size - 1);
子节点布局:[0] = 操作名,[1] = base,
[2 .. 2+operandCount) = 各 operand,
[2+operandCount ..] = 与 operand 一一对应的结果,
最后可跟 1 个「全不命中时的默认结果」。
size |
布局 |
|---|---|
| 偶数 | 无默认结果,全不命中返回 "" |
| 奇数 | 末位是默认结果 |
⚠️ 布局依赖 operandCount = (size - 2) / 2 的整除,
所以 operand 数与结果数必须严格配对,多一个或少一个都会让
operandCount 偏移一位 —— 配置写错时不会报错,只会静默取到错误的节点。
⚠️ 全部 6 个比较都走 getDoubleValue,即纯数值比较,
对文本 tag(如 worldname)会抛 NumberFormatException。
EQ 与 NE 的行距异常
EQ 在 :76,NE 在 :103 —— 相隔 27 行,
而 GT→LT、LT→GE、GE→LE、LE→EQ 都是 16 行。
说明 NE 的实现体比其余 5 个多约 11 行
(推测为取反逻辑 !(a == b) 的展开)。
INVALID 返回 “null”(:5-11)
INVALID {
@Override
public String getValue(Value value) { return "null"; }
}
⚠️ 兜底值是字符串 "null"(4 个字符),
不是 Java 的 null 引用、也不是空串。
所以配置里写错操作名时,HUD 上会显示字面的 “null” 而不是什么都不显示。
fromString(:135-143)
public static Operation fromString(String str) {
for (Operation op : VALUES) {
if (String.valueOf(op).equalsIgnoreCase(str)) return op;
}
return INVALID;
}
- 用
String.valueOf(op)隐式toString()得到常量名 equalsIgnoreCase—— 所以gt/Gt/GT都接受- 未命中返回
INVALID(→ 渲染 “null”)
与 ValueLogic 的分工
| 需求 | 用哪个 |
|---|---|
| 二选一 | ValueLogic 的 if(3 节点) |
| 多路分支 | op + 本枚举(size ≥ 4 节点) |
| 简单比较后接文本 | ValueLogic 的 greater / lesser / equal(返回 true/false) |
相关
- ValueComplex - 唯一调用方(
op函数 /ValueOperation) - ValueLogic - 二元的
if - TagFormatting - 并存的另一套着色机制(与本类无关)