You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java循环内长if语句重构方案咨询

代码分词器长if-else的重构方案

合适的设计模式:状态模式

针对分词这种带有状态流转的逻辑,状态模式是最优解之一,能彻底解决你遇到的代码异味问题:

  1. 定义TokenizerState接口,统一处理字符的方法:
public interface TokenizerState {
    void processChar(char c, TokenizerContext context);
}
  1. 实现不同的状态类,每个类对应一种分词场景:
    • NormalState:处理默认状态下的字符,比如识别关键字、标识符、单独的符号(如{),遇到引号时切换到StringLiteralState
    • StringLiteralState:处理字符串内容,直到遇到闭合引号,之后切回NormalState
    • 如果需要支持注释,还可以新增LineCommentState或BlockCommentState
  2. 定义TokenizerContext上下文类,统一管理共享状态:
public class TokenizerContext {
    private TokenizerState currentState;
    private StringBuilder tempWord = new StringBuilder();
    private List<String> tokens = new ArrayList<>();

    public TokenizerContext() {
        this.currentState = new NormalState(); // 默认状态
    }

    public void switchState(TokenizerState state) {
        this.currentState = state;
    }

    public void addTempWordToTokens() {
        if (tempWord.length() > 0) {
            tokens.add(tempWord.toString());
            tempWord.setLength(0);
        }
    }

    // 提供tempWord、tokens的操作方法
    public void appendToTempWord(char c) {
        tempWord.append(c);
    }

    public List<String> getTokens() {
        // 最后把剩余的tempWord加入tokens
        addTempWordToTokens();
        return tokens;
    }
}
  1. 主分词逻辑简化为:
public List<String> tokenize(String line) {
    TokenizerContext context = new TokenizerContext();
    for (char c : line.toCharArray()) {
        context.getCurrentState().processChar(c, context);
    }
    return context.getTokens();
}

解决你之前的方案问题

  1. CodeChar类依赖问题:状态模式下,所有共享状态(如tempWord)都由TokenizerContext统一管理,状态类只依赖上下文,不需要直接耦合原逻辑中的零散变量,彻底解耦。
  2. 枚举映射Runnable的依赖问题:每个状态是独立的类,逻辑封装在各自的processChar方法里,不存在枚举与逻辑的相互依赖,新增状态只需要实现TokenizerState接口并在合适的时机切换即可,完全符合开闭原则。

现有代码的基础设计问题

现有代码的核心问题是状态判断与状态逻辑强耦合:

  • 把所有状态的判断(是否在字符串、是否是符号、是否是标识符等)都堆在同一个循环的if-else里,导致逻辑复杂度极高
  • 条件顺序敏感(比如必须先判断是否处于字符串中,否则会把字符串里的符号误拆成单独token),调整顺序极易引发bug
  • 新增或修改分词规则必须修改原有循环代码,违反开闭原则,维护成本随规则数量增加急剧上升

当前状态是否可接受

如果你的分词需求完全固定、永远不会扩展(比如只处理示例中的简单关键字、标识符和符号,不需要支持字符串转义、注释、字符字面量等),当前可运行的代码可以接受。但只要有任何扩展需求,必须立即重构,否则后续每一次修改都需要梳理所有条件,出错概率极高。

内容的提问来源于stack exchange,提问作者codeDog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 00:25:16