IF-ELSE 方式
原来以为写一个简单的类型翻译器花不了太多时间,可是真做起来,才发现要注意的点太多了。
首先是处理容器的开启和闭合,这就需要使用栈来保存预期的下一个字符类型,再对比栈顶字符类型和当前处理字符,决定解析的结果。
还要注意类型嵌套的情况下,内层嵌套的容器作为外层容器的元素被解析完成时,需要修改外层容器的预期字符。而且 Map 作为一种相对 Set 和 List 比较特殊的容器,还要处理它的左右元素。同时还不能忘记处理各种异常,如未知字符、容器内是原始类型、容器未正确闭合等。
而这些逻辑混杂在一块就更添复杂度了,通常是一遍代码写下来挺顺畅,找几个特殊的 case 一验证,往往就有没有考虑到的点,你以为解决了这个点就好了,殊不知这个问题点的解决方案又引起了另一个问题。
最终修修补补好多次,终于把代码写完了,连优化的想法都没了,担心又引入新的问题。
最终的伪代码如下:
public String parseToFullType() throws IllegalStateException {
StringBuilder sb = new StringBuilder();
for (; ; this.scanner.next()) {
Character currentChar = scanner.current();
if (currentChar == '\uFFFF') {
return sb.toString();
}
if (isCollection()) {
if (CollectionEnd()) {
dealCollectionEleEnd();
}else {
throw new IllegalStateException("unexpected char '" + currentChar + "' at position " + scanner.getIndex());
}
} else if (isWrapperType()) {
dealSingleEleEnd();
} else if (parseStart()) {
if (collectionStart()) {
putCollecitonExpectEle()