在从文件中读取数据行之前,枚举有多复杂(例如.csv)?

我已经创建了一个平台游戏的一部分,我有一个演员类,表示对象和角色的实例,以及一个types枚举,它表示每个演员将有什么数据(如速度,攻击,防御等)。 使用硬编码的枚举定义来指定每种types的所有数据似乎有点繁琐。 例如

PLANE("Plane", 10, 10, 2, 0), MISSILE("Missile", 1, 0, 0, 4); 

最好是指定一个文件中的数据,然后读取它?

我现在对这个问题的答案是:拿一个DSL,比如使用Kotlin(类似的东西在Groovy中是可能的)。

没有详细说明,以下内容可以是有效的Kotlin(从生产系统复制的实际工作代码):

 buildTreats { category(BEVERAGE) { treat(id = 2, key = "bonusfood.treat.appleJuice") { 47.kcal 0.5 of GLASS } … } … } 

优点是你有完整的代码完成和编译时检查,你不可能有一个CSV文件。

这里有一些想法:

  • 而不是给你的枚举“人类可读”的名称字符串,你可以@Override的toString()方法自动返回Plane飞机(简单 – 只是小写除第一个字母以外的任何东西)
  • 这样的代码打破了以后添加更多function的能力

有旧的开放/封闭的原则 。 基本上它是这样说的:你的代码需要在那些最可能发生变化的地方开放

我很确定:今天你需要4个数值,比如10,10,2,0。 但在几天之内,你可能想要更多的属性。 然后你必须把所有的枚举常量,并更新它们。

从这个意义上说,在这里放弃一些编译时安全可能会更好。 并使用一个地图代替。 Map键可以是一个枚举(只列出一些玩家/物品/ …具有的不同的潜在属性)。 地图键将是这个力量的具体价值。

如果你想要沿着这条路线走,你可以为每个枚举常量指定一个types 。 所以你知道STRENGTH的一个map值是一个Integer对象,或者类似的东西。

换句话说,你可能会变成这里的黑暗领域。

enum的美妙之处在于它们被固定在代码中,不会改变。 这在编码,types检查时提供了巨大的好处,您可以使MapSet成为可能,并且可以遍历它们,甚至可以与它们进行切换(尽管现在它们可以有自己的function,但不常见)。 甚至当枚举列表更改时,您甚至可以将它们保存在数据库中,只要您使用它们的名称即可正确映射数据。

因此,我不会放弃他们,我可能会添加一个新的,可能是“OTHERS”,它可以提供任何新的实验等。

如果你的核心问题是保持参数的单调乏味,那么通过所有的方法使用静态初始化器从配置中读取数据。