我目前正在制作一个项目。在这个项目中,许多对象都有一个ID,用于从代码不同部分的配置文件中获取实体的属性和行为。使用枚举作为对象ID
我使用String作为ID,那对我很不错,但也存在一些问题:
的错别字不容易被发现;
有没有代码完成,所以我需要记住所有的ID
我想用枚举结构作为对象ID。这应该解决所有这些问题。我想知道,是否有使用枚举作为实体标识符的缺陷?
我目前正在制作一个项目。在这个项目中,许多对象都有一个ID,用于从代码不同部分的配置文件中获取实体的属性和行为。使用枚举作为对象ID
我使用String作为ID,那对我很不错,但也存在一些问题:
的错别字不容易被发现;
有没有代码完成,所以我需要记住所有的ID
我想用枚举结构作为对象ID。这应该解决所有这些问题。我想知道,是否有使用枚举作为实体标识符的缺陷?
有使用枚举作为ID的不少缺陷:
==
比较两个枚举情况下,你需要要么使用switch
或a.equals(b)
或Type.enumEq(a,b)
恕我直言,除了这些,主要的错误是,如果您添加枚举项,枚举表示可能会改变,因为它们的表示包含它们在枚举中的索引。
因此,如果将代码从enum ID { Foo; Bar }
更新为enum ID { Zero; Foo; Bar; }
,Foo和Bar值将更改其索引,这可能会导致意外的行为。
如果您计划序列化并存储这些值,这是一个主要问题。
我觉得你最好的选择是使用@:enum abstract
按照https://haxe.org/manual/types-abstract-enum.html
这样,你得到两全其美:你的ID是实际运行时的字符串,但是编译器知道这是预期值,你会得到严格打字。
我也推荐'@:enum abstract' – KevinResoL
你总是可以声明字符串常量,不是吗?它解决了你的两个问题。 – Sweeper
我认为这有些相当于枚举,不是吗? – Gulvan
我对haxe了解不多。如果它们在haxe中是同一个事物,那就使用它。一些编程语言不允许字符串成为枚举的基础值。 – Sweeper