唯一标识 ID
唯一标识类型
ID
是一个密封类型, 提供了如下几种类型的实现类型:
StringID
UUID
IntID
LongID
UIntID
ULongID
并可将它们简单的归类为:
字符串类型
数字类型
有符号数字类型
无符号数字类型
创建实例
在 Kotlin 中, 你可以使用扩展属性 xxx.ID
来构建对应类型的 ID
实例。
对于 UUID
你可以:
使用
UUID.random(...)
获取一个随机值。使用一个长度为
16
的ByteArray
构建它。使用两个分别代表高低位的
Long
构建它。在 JVM 平台中使用
java.util.UUID
进行转化。
在 Java 中, 你可以使用 xxx.ID
来构建对应类型的 ID
实例。
字面值
所有的ID实现类型的 toString
都会直接输出它们的“字面值”。 例如:
序列化
ID
基于 kotlinx-serialization
实现对其的序列化, 且序列化的值是一个非结构化的字面值。
其他注意事项
equals 与 hashCode
ID
的所有类型均允许互相通过 equals
判断是否具有相同的字面值。 equals
实际上不会判断类型, 因此如果两个不同类型的 ID
的字面值相同, 例如值为 "1"
的 StringID
和值为 1
的 IntID
, 它们之间使用 equals
会得到 true
。
如果你希望严格匹配两个 ID
类型, 那么使用 equalsExact
。
在不同类型的两个 ID
(例如 StringID
和 IntID
) equals
结果为 true
的情况下, 它们的 hashCode
则可能是不同的。 因此, 不适合将不同类型的 ID
混用于诸如 hash key 的地方。
数字的符号
在 Java 中使用数字ID时, 需要注意无符号ID类型与有符号ID类型之间的差异。 一个相同的数值, 使用无符号类型和有符号类型的ID构建的结果可能是不同的, 获取到的 value
和字面值也可能是不同的。
Java在操作无符号ID的时候需要注意使用相关的无符号API。 以 long
为例:
如果希望得到一些符合预期的结果, 你应该使用Java中的无符号相关API: