java - token 类的设计模式

标签 java enums

我的程序包含以下类

class Token {
    ptivate TokenType t;
    // ...
    public Token(TokenType t) {
        this.t = t;
    }
    // ...
    public TokenType getType() {return t}
}

interface TokenType {}

enum Function implements TokenType {
    // ...
    LOG {
        double apply(double x) {
            return Math.log(x);
        }
    }
    // ... 
    abstract double apply(double x);
}

enum Operation implements TokenType {
    // ... 
    abstract double apply(double x, double y);
}

enum Const implements TokenType {
    // no behaviors
}

现在当我想使用它们时我必须这样做

Token t = new Token(Function.LOG);
Function f = (Function) t.getType();
double x = f.apply(1.0);

我需要具有不同 token 类型的 token 列表。让具有不同行为的不同枚举类都实现一个空接口(interface)是一个坏主意吗?我怎样才能避免这里的沮丧?

最佳答案

使 token 通用:

class Token<T extends Enum<T> & TokenType> {
    ptivate T t;
    // ...
    public Token(T t) {
        this.t = t;
    }
    // ...
    public T getType() {return t}
}

当然,如果您实际上不需要枚举约束,您可以简化绑定(bind)到的类型变量:

<T extends TypeToken>

然后:

Token<Function> t = new Token<>(Function.LOG);
Function f = t.getType();
double x = f.apply(1.0);
<小时/>

从评论来看,您似乎关心如何设计具有 TokenType 项的异构列表。

您遇到的问题是 apply 方法不是 TokenType 不同实现所共有的接口(interface)的一部分(例如 TokenType 本身)。给定此类实例的列表,您当前必须检查实例的类型,进行强制转换,然后调用适当的方法。

相反,请考虑如何拥有一个通用方法。您正在拿一些 double ;并返回一个双倍。实现此目的的一种方法是使用堆栈,例如

interface DoubleStack {
  double pop();
  void push(double d);
}

interface TokenType {
  void apply(DoubleStack stack);
}

现在您可以实现日志的 apply 方法,其中弹出一次并推送一次;或操作,弹出两次并推送一次。

那么您无需担心类型:您可以简单地在任何实例上调用 apply 方法:

DoubleStack stack = ...;
for (TokenType t : listOfTokenTypes) {
  t.apply(stack);
}

关于java - token 类的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48454229/

相关文章:

c# - 值得将枚举转换为它的值的场景

java - 如何从注释处理器读取枚举常量的值?

c# - C# 标志枚举中的私有(private)值

java - Files.isHidden C :\\changed between JDK12 and JDK13 on windows

java - 管理 EJB 项目中的 hibernate 实体

java - Soap with CXF,设置SSL和TLS协议(protocol)版本

c# - 强制转换为无效枚举值 Enum.ToObject,不会引发异常,将 Enum 设置为 int

java - 用 Java 中的类替换枚举结构是否仍然相关?

java - 如何创建一个 while 循环,只要用户在每个循环结束时输入正确的标签/代码,它就会继续运行?

java - 使用 Angular js、Spring、hibernate 一次保存大量行