ICompatHandler(兼容处理器接口)

基本信息

属性 值
类 com.gtnewhorizons.angelica.loading.fml.compat.ICompatHandler
路径 src/main/java/com/gtnewhorizons/angelica/loading/fml/compat/ICompatHandler.java
行数 28
类型 public interface ICompatHandler(:6)
方法数 5,全部 default,全部默认返回 null

它是什么

不是 transformer,也不挂在任何 FML 阶段上。它是纯数据载体:CompatHandlers 枚举提供数据,GenericCompatTransformer 在构造期把这些数据读成 4 张查表,再在类加载时按表分派给 4 个 generic/ 子 transformer。

因此它的生命周期早于任何字节码变换:数据在 coremod 阶段(AngelicaClientTweaker 构造 GenericCompatTransformer 时)就已固化。

5 个 default 方法

方法 行 返回类型 语义 消费方
getFieldLevelTessellator() :8-10 Map<String, List<String>> 目标类 → 需要局部 Tessellator 的方法名 FieldLevelTessellatorTransformer
getTileEntityNullGuard() :12-14 Map<String, List<String>> 目标类 → 需要 null 守卫的方法名 TileEntityNullGuardTransformer
getThreadSafeISBRHAnnotations() :16-18 Map<String, Boolean> 目标类 → @ThreadSafeISBRH(perThread=?) ThreadSafeISBRHAnnotationTransformer
getHUDCachingEarlyReturn() :20-22 Map<String, List<String>> 目标类 → 需要 HUDCaching 早退的方法名 HUDCachingEarlyReturnTransformer
extraTransformers() :24-26 List<String> 额外 transformer 类名 CompatHandlers.getTransformers()

全部返回 null(而非空集合)是刻意的设计:CompatHandlers.getTransformers() 用 handler.extraTransformers() != null 判空跳过,GenericCompatTransformer.registerHandler() 也用 != null 守卫后才 putAll。若返回空集合,这两处判空语义会反转。

5 个方法的覆写矩阵

Handler FieldLevelTessellator TileEntityNullGuard ThreadSafeISBRH HUDCachingEarlyReturn extraTransformers
StacksOnStacks ✔ ✔ ✔ — ✔
ImmersiveEngineering — ✔ ✔ — ✔
ExtraUtils — — ✔ — —
Thaumcraft — — — ✔ —
ThaumicHorizons — — — ✔ —

getThreadSafeISBRHAnnotations() 是唯一 3 个 handler 都覆写的方法,也是唯一一个可以「多 handler 覆盖同一目标类」而不冲突的表——GenericCompatTransformer 对 4 张表都做 putAll,而 5 个 handler 的目标类名互不重叠。

已知问题

接口没有任何契约文档(无类级 Javadoc),且 extraTransformers() 返回的是完全限定字符串而不是 Class<?>,拼写错误只能在运行期以 ClassNotFoundException 暴露。相比之下 api/ThreadSafeISBRH 等对外 API 都有完整 Javadoc —— 本接口是内部实现细节,未做对外文档化。

相关条目