2

我有各种NodeToken其他课程。每个类都有自己的Type枚举。

我有节点列表、标记列表和其他事物列表。

而且我经常想看看列表中是否有任何特定项目Type

例如,要查看标记列表中是否有任何关键字,我会遍历它们:

Token found = null;
for(Token token: statement)
    if(token.type == Token.Type.KEYWORD &&
      (token.token.equals("static") ||
      (token.token.equals("final")) {
        found = token;
        break;
    }
if(found != null) {
    ....

如果我编写小帮手,我可以大量整理我的代码(因为我想弄清楚列表中的内容很多):

Token any(Collection<Token> haystack,Token.Type type,String... needles) {
   for(Token straw: haystack)
       if(straw.type == type)
            for(String needle: needles)
                if(needle.equals(straw.token))
                    return straw;
   return null;
}

然后,在其他地方,我可以:

if((found = any(statement,Token.Type.KEYWORD,"static","final")) != null)
   ...

有什么方法可以概括这个Node和其他变量,以及不是字符串的比较,字段不同,命名不同?

使用 C++ 模板,您可以回避类型;使用Java,我正在努力了解如何做到这一点,尽管使类与它们自己的类型等可比可能是一种前进的方式?

4

2 回答 2

4

使用鸭子类型的事情通常可以通过 java 中的接口来完成。考虑这个接口:

public interface Typed<T extends Enum<T>> {
    T getType();
    String getToken();
}

然后您可以更改您的any方法以仅使用实现此接口的类型:

public <A extends Enum<A>, B extends Typed<A>> B any(Collection<B> haystack, A type, String... needles) {
    for (B straw : haystack)
        if (straw.getType().equals(type))
            for (String needle : needles)
                if (needle.equals(straw.getToken()))
                    return straw;
    return null;
}
于 2012-12-03T19:15:33.357 回答
1

您可以在 Java 中使用带有反射的鸭子类型,但它很可能是

  • 更复杂,而不是更简单
  • 更容易出错

我建议你坚持写和理解最简单的东西。

FOUND: {
  for(Token token: statement)
    if(token.type == Token.Type.KEYWORD &&
      (token.token.equals("static") ||
      (token.token.equals("final")) {
        // handle token here
        break FOUND;
    }
  // handle not found here
}

您可以创建一个方法并在找到匹配项时返回,而不是使用标签。

我怀疑 KEYWORD 检查在这里是多余的,因为我假设您不能拥有static或者final它不是关键字。一种更有效的方法是这样的。

static final List<String> KEYWORDS_TO_MATCH = Arrays.asList("static", "final");

FOUND: {
   for(Token token: statement)
     if(KEYWORDS_TO_MATCH.contains(token.token)) {
        // handle token here
        break FOUND;
     }
   // handle not found here
}
于 2012-12-03T19:08:04.293 回答