唯一标识 ID
唯一标识类型
ID 是一个密封类型, 提供了如下几种类型的实现类型:
StringIDUUIDIntIDLongIDUIntIDULongID
并可将它们简单的归类为:
字符串类型
数字类型
有符号数字类型
无符号数字类型
创建实例
在 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: