使用枚举作为对象 ID
Using enums as object IDs
我目前正在做一个项目。在这个项目中,许多对象都有一个ID,用于从不同代码部分的配置文件中获取实体的属性和行为。
我使用String作为ID,很适合我,但是有一些问题:
打字不易发现;
没有代码补全,需要记住所有的ID
我正在考虑使用枚举结构作为对象 ID。这应该可以解决所有这些问题。我想知道,使用枚举作为实体标识符有什么陷阱吗?
使用枚举作为 ID 有很多陷阱:
- 比较:你不能直接用
==
比较两个枚举实例,你需要使用switch
或a.equals(b)
或Type.enumEq(a,b)
- 序列化 : As you can see, Json序列化不明显
- 表示:每个平台的底层表示不同。
恕我直言,除此之外,主要的缺陷是如果您添加枚举项,枚举表示可能会发生变化,因为它们的表示包含它们在枚举中的索引。
因此,如果您将代码从 enum ID { Foo; Bar }
更新为 enum ID { Zero; Foo; Bar; }
,Foo 和 Bar 值的索引将发生变化,可能会导致意外行为。
如果您计划序列化和存储这些值,这是一个主要问题。
我认为您最好的选择是根据 https://haxe.org/manual/types-abstract-enum.html
使用 @:enum abstract
通过这种方式,您可以两全其美:您的 ID 是实际的运行时字符串,但编译器知道哪些值是预期的,并且您可以严格输入。
我目前正在做一个项目。在这个项目中,许多对象都有一个ID,用于从不同代码部分的配置文件中获取实体的属性和行为。
我使用String作为ID,很适合我,但是有一些问题:
打字不易发现;
没有代码补全,需要记住所有的ID
我正在考虑使用枚举结构作为对象 ID。这应该可以解决所有这些问题。我想知道,使用枚举作为实体标识符有什么陷阱吗?
使用枚举作为 ID 有很多陷阱:
- 比较:你不能直接用
==
比较两个枚举实例,你需要使用switch
或a.equals(b)
或Type.enumEq(a,b)
- 序列化 : As you can see, Json序列化不明显
- 表示:每个平台的底层表示不同。
恕我直言,除此之外,主要的缺陷是如果您添加枚举项,枚举表示可能会发生变化,因为它们的表示包含它们在枚举中的索引。
因此,如果您将代码从 enum ID { Foo; Bar }
更新为 enum ID { Zero; Foo; Bar; }
,Foo 和 Bar 值的索引将发生变化,可能会导致意外行为。
如果您计划序列化和存储这些值,这是一个主要问题。
我认为您最好的选择是根据 https://haxe.org/manual/types-abstract-enum.html
使用@:enum abstract
通过这种方式,您可以两全其美:您的 ID 是实际的运行时字符串,但编译器知道哪些值是预期的,并且您可以严格输入。