我需要为表达为text的输入类型构建一个简单的解析器。
我使用两个int数组在Java中实现了FSM:
states[][]
actions[][]
当我调试它时,我意识到使用Java Enums可能更容易,因为这些类型的变量应该显示为IntelliJ中调试视图中的值。然而,当我开始沿着这条路走时,似乎使用Enums的唯一方法是将状态和动作表放在HashMap中 - 或者有没有办法制作尺寸为Enum值的多维数组?如果我能帮助它,我宁愿不接受HashMap带来的对象创建和性能影响。
然后我想我可能会看看Scala,看看它是不是更好的选择。
所以,问题是 - Scala是否是表达严密FSM的更好语言,还是我最好坚持使用Java int数组?
答案 0 :(得分:2)
我衷心建议你看看Scala - 它是一种很棒的语言,非常值得评估。但是,你所描述的问题不仅仅是一个学习新语言的好理由。如果您学习Scala,很可能实现您的FSM解析器将比在Java中更容易 - 但学习Scala并实现一个简单的FSM解析器可能并不比在Java中更容易。< / p>
另外,你还不太清楚你想要的细节:你想用Enum值索引数组吗?你可以进行类型转换。你想让数组保存枚举吗?这应该工作。你想将内部数组解释为枚举吗?编写一个包装函数,创建一个对象,为您提供一个看起来像你想要的视图。
答案 1 :(得分:1)
多维枚举数组很好。
以下是否适合您(也许我误解了您的问题):
public class SO {
public static void main( String[] args ) {
States[][] array = new States[0][];
}
private enum States {
a,
b
}
}
如果你有大型FSM或其中很多(就像你可以在游戏中拥有的那样)并且正确地想要躲避不必要的对象创建(以及可以真正杀死你的游戏的不必要的GC)那么肯定可以使用Java枚举获得一些安全性,但却拥有高效的代码。
另一件好事是,如果我没有错误地在(快速)表开关(而不是跛脚查找开关)上默认使用Java中的枚举“case”语句。
答案 2 :(得分:1)
在我看来,你的主要关注点是表现。虽然有许多原因可以在Scala中执行此操作,但使更快不是其中之一。它会像Java一样快,如果你注意避免更高级别的抽象,但不会更快。