枚举类适合统一管理敏感词分类类型,如政治类、色情类等,每个枚举项携带ID、中文名、过滤强度和启用状态,并可实现FilterStrategy接口封装差异化过滤逻辑,敏感词数据须外置存储,枚举仅负责分类与策略定义。

用枚举统一管理敏感词分类类型
枚举类天然适合定义有限、稳定、有业务含义的分类维度。比如将敏感词划分为 政治类、色情类、暴恐类、广告营销类、违禁品类 等,每个枚举项可携带分类 ID、中文名、默认过滤强度、是否启用等元信息。
示例:
立即学习“Java免费学习笔记(深入)”;
public enum SensitiveCategory {
POLITICAL(1, "政治敏感", 3, true),
PORNOGRAPHY(2, "色情低俗", 5, true),
TERRORISM(3, "暴恐违禁", 5, true),
AD_PROMOTION(4, "广告营销", 2, false),
ILLEGAL_GOODS(5, "违禁物品", 4, true);
private final int id;
private final String label;
private final int severity; // 过滤强度:1~5,越高越严格(如直接拦截 vs 替换脱敏)
private final boolean enabled;
SensitiveCategory(int id, String label, int severity, boolean enabled) {
this.id = id;
this.label = label;
this.severity = severity;
this.enabled = enabled;
}
// 提供静态查找方法,便于运行时根据 ID 或名称获取分类
public static SensitiveCategory fromId(int id) {
for (SensitiveCategory c : values()) {
if (c.id == id) return c;
}
return null;
}
public static SensitiveCategory fromLabel(String label) {
for (SensitiveCategory c : values()) {
if (Objects.equals(c.label, label)) return c;
}
return null;
}
// getter 方法略
}
结合枚举设计可扩展的过滤策略接口
不同分类的敏感词可能需要不同处理逻辑:政治类需实时拦截+上报,广告类可仅打标不拦截,色情类支持模糊匹配+替换。此时可让枚举实现统一策略接口,把“行为”内聚到枚举实例中。
示例:
立即学习“Java免费学习笔记(深入)”;
public interface FilterStrategy {
boolean shouldBlock(String word);
String apply(String text);
void onMatch(String word, String context);
}
public enum SensitiveCategory implements FilterStrategy {
POLITICAL(1, "政治敏感", 3, true) {
@Override
public boolean shouldBlock(String word) {
return true; // 政治类一律拦截
}
@Override
public String apply(String text) {
return "[已屏蔽]";
}
@Override
public void onMatch(String word, String context) {
AuditLogger.warn("POLITICAL HIT: {} in {}", word, context);
}
},
AD_PROMOTION(4, "广告营销", 2, false) {
@Override
public boolean shouldBlock(String word) {
return false; // 不拦截,仅标记
}
@Override
public String apply(String text) {
return text; // 原文返回
}
@Override
public void onMatch(String word, String context) {
TagRecorder.tag(context, "AD_PROMOTION", word);
}
};
// 公共字段和构造器同上...
}
运行时按枚举分类加载与路由敏感词规则
实际过滤时,系统应先识别文本命中哪个枚举分类,再调用对应策略。建议搭配轻量级规则引擎或预加载结构(如 Trie 树 + 分类标签):
- 构建每个分类专属的
AcTrie或HashSet<String>,键为敏感词,值为所属SensitiveCategory - 扫描文本时,匹配到词后立即拿到其分类枚举,调用
category.shouldBlock(...)决策 - 支持热更新:通过配置中心推送「分类启用状态」或「新词列表」,动态刷新对应枚举下的词库(注意线程安全)
避免常见误区:枚举不是万能存储容器
枚举适合管理分类逻辑和策略模板,但不要把大量敏感词本身存在枚举里。例如下面写法是反模式:
// ❌ 错误:枚举膨胀、无法热更新、编译期固化
PORNOGRAPHY_001("naked", 2),
PORNOGRAPHY_002("xxx", 2),
// ... 几百个?
正确做法是:
- 枚举只定义「谁来管」——即分类和策略行为
- 敏感词数据外置到数据库、Redis 或配置文件,按
category_id关联 - 启动时或定时任务中,将词加载进对应分类的内存结构(如
ConcurrentHashMap<SensitiveCategory, Set<String>>)
这样既保持枚举的语义清晰性,又保障系统的可维护性与伸缩性。


















