2017-10-15 99 views
0

我目前正在制作一个项目。在这个项目中,许多对象都有一个ID,用于从代码不同部分的配置文件中获取实体的属性和行为。使用枚举作为对象ID

我使用String作为ID,那对我很不错,但也存在一些问题:

  1. 的错别字不容易被发现;

  2. 有没有代码完成,所以我需要记住所有的ID

我想用枚举结构作为对象ID。这应该解决所有这些问题。我想知道,是否有使用枚举作为实体标识符的缺陷?

+0

你总是可以声明字符串常量,不是吗?它解决了你的两个问题。 – Sweeper

+0

我认为这有些相当于枚举,不是吗? – Gulvan

+0

我对haxe了解不多。如果它们在haxe中是同一个事物,那就使用它。一些编程语言不允许字符串成为枚举的基础值。 – Sweeper

回答

4

有使用枚举作为ID的不少缺陷:

  • 比较:您不能直接与==比较两个枚举情况下,你需要要么使用switcha.equals(b)Type.enumEq(a,b)
  • 序列化As you can see,Json序列化并不明显。
  • 表示:每种平台的底层表示都不相同。

恕我直言,除了这些,主要的错误是,如果您添加枚举项,枚举表示可能会改变,因为它们的表示包含它们在枚举中的索引。

因此,如果将代码从enum ID { Foo; Bar }更新为enum ID { Zero; Foo; Bar; },Foo和Bar值将更改其索引,这可能会导致意外的行为。

如果您计划序列化并存储这些值,这是一个主要问题。

我觉得你最好的选择是使用@:enum abstract按照https://haxe.org/manual/types-abstract-enum.html

这样,你得到两全其美:你的ID是实际运行时的字符串,但是编译器知道这是预期值,你会得到严格打字。

+0

我也推荐'@:enum abstract' – KevinResoL