首页 > 编程笔记 > Java笔记

解释器模式在JDK和Spring源码中的应用

本节我们介绍解释器模式在 JDK 和 Spring 源码中的应用。

解释器模式在JDK源码中的应用

正则表达式是解释器模式一个很好的体现,因为正则表达式本身就是一个语法的封装。

下面先看 JDK 源码中 Pattern 类对正则表达式的编译和解析,源码如下。
package java.util.regex;

public final class Pattern
    implements java.io.Serializable
{
...
private Pattern(String p, int f) {
        pattern = p;
        flags = f;

        // to use UNICODE_CASE if UNICODE_CHARACTER_CLASS present
        if ((flags & UNICODE_CHARACTER_CLASS) != 0)
            flags |= UNICODE_CASE;

        // Reset group index count
        capturingGroupCount = 1;
        localCount = 0;

        if (pattern.length() > 0) {
            try {
                compile();
            } catch (StackOverflowError soe) {
                throw error("Stack overflow during pattern compilation");
            }
        } else {
            root = new Start(lastAccept);
            matchRoot = lastAccept;
        }
    }
    ...
    public static Pattern compile(String regex) {
        return new Pattern(regex, 0);
    }
    public static Pattern compile(String regex, int flags) {
        return new Pattern(regex, flags);
    }
    ...
}

解释器模式在Spring源码中的应用

在 Spring 中,ExpressionParser 接口内部采用的也是解释器模式,它封装了字符串表达式的语法,源码如下。
package org.springframework.expression;

public interface ExpressionParser {

    Expression parseExpression(String expressionString) throws ParseException;

    Expression parseExpression(String expressionString, ParserContext context) throws ParseException;
}
ExpressionParser 不知道大家有没有用过,这里面也可以进行加减乘除运算。这里我们不深入讲解源码,通过《解释器模式》一节编写的案例大致就能够清楚其原理。如下是一个简单的应用示例:
package net.biancheng.c.interpreter;

import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;

public class Test {
    public static void main(String[] args) {
        ExpressionParser parser = new SpelExpressionParser();
        Expression expression = parser.parseExpression("100*2+400*1+66");
        int result = (Integer) expression.getValue();
        System.out.println("计算结果是:" + result);
    }
}
运行结果如下。

计算结果是:666

由运行结果可以看到,运行结果与预期结果是一致的。

解释器模式一般在业务开发中用的相对较少,常用的表达式都有人解析好了,直接用就可以了,除非我们从事底层开发需要自己去定义较为复杂的表达式。

所有教程

优秀文章