JSoup源码中含成员与方法的enum声明模式相关问题咨询
问题解答
1 对应设计名称
这并非特殊的自定义设计模式,是Java语言原生支持的枚举高级用法,业界通常将这类用法称为 策略枚举,属于策略设计模式的轻量化实现方案,完全符合Java的语法规范。
2 运行逻辑
整个初始化过程严格遵循Java的类加载规则:
- 首先完成
Entities外部类的静态成员初始化:代码中省略的部分会通过静态代码块给xhtmlByVal、baseByVal、fullByVal三个静态Map赋值,加载对应的HTML实体转义映射表,这一步的执行时机早于内部枚举类的初始化。 - 接下来初始化
EscapeMode枚举类:三个枚举实例xhtml、base、extended依次调用私有构造方法,将已经初始化完成的对应Map绑定到每个枚举实例的私有map成员变量中。 - 枚举实例全部初始化完成后,对外提供
getMap()公共方法,上层调用方选中对应枚举实例即可获取绑定的转义映射表。
3 核心实现能力
- 天然单例:依靠Java枚举实例全局唯一的特性,保证每种转义模式的映射表全局仅存一份,不会重复占用内存,也不需要额外实现单例控制逻辑。
- 类型安全:上层调用方只能选择预定义的三种转义模式,编译期即可校验参数合法性,不可能传入非法的模式值。
- 逻辑内聚易扩展:转义模式相关的属性、方法全部封装在枚举内部,和上层业务逻辑解耦,后续需要新增转义模式时,仅需新增枚举实例即可,不需要修改原有调用逻辑。
- 轻量化策略实现:相比传统策略模式需要定义策略接口、多个实现类的写法,策略枚举的代码更简洁,非常适合固定策略数量的业务场景。
典型调用示例
// JSoup中设置输出转义规则的写法 Document.OutputSettings settings = new Document.OutputSettings(); // 直接选择预定义的枚举值即可,不需要额外创建对象 settings.escapeMode(Entities.EscapeMode.extended);
内容的提问来源于stack exchange,提问作者selbie
相关产品推荐
相关产品推荐

