核心是用sealed class+switch表达式实现类型安全的运算符函数映射,每个运算符封装为纯函数对象,支持动态注册与内聚错误处理。

核心不是堆砌 if-else 或写一堆 switch-case 调方法,而是让“运算符”本身成为可执行行为的载体——用现代面向对象特性把算力分发变成一次类型安全、无副作用、可扩展的函数映射。
用 sealed class + switch 表达式实现类型安全路由
定义封闭的运算符类型,杜绝非法值:
- Java 中用 sealed interface Op 或 enum Op(Java 17+),只允许预设的 "+"、"-"、"*"、"/" 等实现
- C# 中用 sealed record struct 或 enum with [System.Runtime.CompilerServices.IsExternalInit] 约束构造入口
- switch 表达式直接匹配具体子类型(如 Op.Add),编译期确保全覆盖,无需 default 分支兜底
每个运算符封装为纯函数对象
不写“case '+' : return add(a,b)”,而是让每个 case 直接返回一个闭包或 lambda:
- Java 示例:case Op.Add -> (a, b) -> a + b
- C# 示例:Op.Add => (a, b) => a + b
- 返回类型统一为 BiFunction
(Java)或 Func (C#) - 除零等校验内聚在对应分支里,比如 "/" 分支自带 b != 0 ? a / b : throw new DivByZeroException()
支持运行时动态注册新运算符
不改主逻辑也能加 "^" 幂运算或 "mod" 取模:
- 定义轻量 record:record Operator(string Symbol, Func
Apply) - 用不可变 Map 存储:Map.of("+", new Operator("+", (a,b)→a+b), ...)
- 主流程仍走 switch 表达式,只是 source 从字面量换成 map.get(op).apply(...) —— 语义不变,扩展自由
错误处理与状态完全内聚
异常不抛到外层 try-catch,也不靠额外 validate() 方法:
- 空运算符、null 输入、非法符号,由 switch 的 default 或 sealed class 的未覆盖分支统一拦截
- 每个运算分支自行决定是否抛异常、返回 Optional、或 fallback 到默认值
- 整个表达式返回的是可直接 apply 的函数对象,调用方只需 op.apply(left, right),无分支感知负担











