不改变类的定义,优化以下方法: private Token nextToken() { Token result; if (!hasEnd) { if (index < source.length()) { switch (source.charAt(index)) { case '.': result = new Token(TokenType.DOT, source.charAt(index)); // System.out.println("DOT"); break; case '\': result = new Token(TokenType.LAMBDA, source.charAt(index)); // System.out.println("LAMBDA"); break; case '(': result = new Token(TokenType.LPAREN, source.charAt(index)); // System.out.println("LPAREN"); break; case ')': result = new Token(TokenType.RPAREN, source.charAt(index)); // System.out.println("RPAREN"); break; case ' ': result = new Token(TokenType.BLANK, source.charAt(index)); break; default: if ('a' <= source.charAt(index) && source.charAt(index) <= 'z') { int temp = index + 1; while (temp < source.length() && (('a' <= source.charAt(temp) && source.charAt(temp) <= 'z') || ('A' <= source.charAt(temp) && source.charAt(temp) <= 'Z'|| ('0' <= source.charAt(temp) && source.charAt(temp) <= '9')))) temp++; result = new Token(TokenType.LCID, source.substring(index, temp)); // System.out.println("LCID"); } else { result = new Token(TokenType.EOF, ""); // System.out.println("EOF"); } } } else { result = new Token(TokenType.EOF, ""); System.out.println("EOF"); hasEnd = true; } } else result = new Token(TokenType.EOF, ""); return result; }
时间: 2024-01-05 21:03:02 浏览: 64
首先可以看到在方法内部存在大量的重复代码,可以将这些代码提取出来作为一个独立的方法。比如将 "result = new Token(TokenType.EOF, "");" 提取出来,放到一个独立的方法中,这样会使代码更加简洁易懂。
其次,可以使用一个 HashMap 来存储字符与对应的 TokenType,这样可以避免使用大量的 switch-case 语句,提高代码的可读性和可维护性。
最后,可以将一些重复的逻辑提取出来,比如判断字符是否为字母或数字的逻辑可以提取出来作为一个方法,这样可以减少代码重复。
下面是优化后的代码:
```
private Token nextToken() {
if (hasEnd) {
return new Token(TokenType.EOF, "");
}
if (index >= source.length()) {
hasEnd = true;
return new Token(TokenType.EOF, "");
}
char ch = source.charAt(index);
if (ch == ' ') {
index++;
return nextToken();
}
if (TOKEN_MAP.containsKey(ch)) {
TokenType type = TOKEN_MAP.get(ch);
index++;
return new Token(type, ch);
} else if (isLetterOrDigit(ch)) {
int temp = index + 1;
while (temp < source.length() && isLetterOrDigit(source.charAt(temp))) {
temp++;
}
String value = source.substring(index, temp);
index = temp;
return new Token(TokenType.LCID, value);
} else {
hasEnd = true;
return new Token(TokenType.EOF, "");
}
}
private boolean isLetterOrDigit(char ch) {
return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') || ('0' <= ch && ch <= '9');
}
private static final Map<Character, TokenType> TOKEN_MAP = new HashMap<>();
static {
TOKEN_MAP.put('.', TokenType.DOT);
TOKEN_MAP.put('\\', TokenType.LAMBDA);
TOKEN_MAP.put('(', TokenType.LPAREN);
TOKEN_MAP.put(')', TokenType.RPAREN);
}
```
阅读全文