Simple Robot v4.6.0 Help

唯一标识 ID

唯一标识类型

ID 是一个密封类型, 提供了如下几种类型的实现类型:

  • StringID

  • UUID

  • IntID

  • LongID

  • UIntID

  • ULongID

并可将它们简单的归类为:

  • 字符串类型

  • 数字类型

    • 有符号数字类型

    • 无符号数字类型

创建实例

在 Kotlin 中, 你可以使用扩展属性 xxx.ID 来构建对应类型的 ID 实例。

val strID: StringID = "1".ID val iID: IntID = 1.ID val lID: LongID = 1L.ID val uiID: UIntID = 1u.ID val ul: ULong = 1u val ulID: ULongID = ul.ID

对于 UUID 你可以:

  • 使用 UUID.random(...) 获取一个随机值。

  • 使用一个长度为 16ByteArray 构建它。

  • 使用两个分别代表高低位的 Long 构建它。

  • 在 JVM 平台中使用 java.util.UUID 进行转化。


val uuid = UUID.random()

在 Java 中, 你可以使用 xxx.ID 来构建对应类型的 ID 实例。

var intID = Identifies.of(1); var longID = Identifies.of(1L); var uLongID = Identifies.ofULong(1); var uIntID = Identifies.ofUInt(1); var strID = Identifies.of("1"); var uuid = Identifies.uuid(); // random

字面值

所有的ID实现类型的 toString 都会直接输出它们的“字面值”。 例如:

val intId = 1.ID val strId = "1".ID println(intId) // 1 println(strId) // 1
var intID = Identifies.of(1); var strID = Identifies.of("1"); System.out.println(intID); // 1 System.out.println(strID); // 1

序列化

ID 基于 kotlinx-serialization 实现对其的序列化, 且序列化的值是一个非结构化的字面值

@Serializable data class Foo(val value: UIntID) // 序列化结果: {"value": 123456}

其他注意事项

equals 与 hashCode

ID 的所有类型均允许互相通过 equals 判断是否具有相同的字面值equals 实际上不会判断类型, 因此如果两个不同类型的 ID 的字面值相同, 例如值为 "1"StringID 和值为 1IntID, 它们之间使用 equals 会得到 true

如果你希望严格匹配两个 ID 类型, 那么使用 equalsExact

不同类型的两个 ID (例如 StringIDIntID) equals 结果为 true 的情况下, 它们的 hashCode 则可能是不同的。 因此, 不适合将不同类型的 ID 混用于诸如 hash key 的地方。

数字的符号

在 Java 中使用数字ID时, 需要注意无符号ID类型与有符号ID类型之间的差异。 一个相同的数值, 使用无符号类型和有符号类型的ID构建的结果可能是不同的, 获取到的 value 和字面值也可能是不同的。

Java在操作无符号ID的时候需要注意使用相关的无符号API。 以 long 为例:

long value = -1; LongID longID = Identifies.of(value); ULongID uLongID = Identifies.ofULong(value); System.out.println(longID); // 字面值:-1 System.out.println(uLongID); // 字面值:18446744073709551615 System.out.println(longID.getValue()); // value 数值:-1 System.out.println(uLongID.getValue()); // value 数值:-1

如果希望得到一些符合预期的结果, 你应该使用Java中的无符号相关API:

long value = Long.parseUnsignedLong("18446744073709551615"); ULongID uLongID = Identifies.ofULong(value); System.out.println(uLongID); // 字面值:18446744073709551615 System.out.println(Long.toUnsignedString(uLongID.getValue())); // 经转化的 value 数值: 18446744073709551615
Last modified: 19 September 2024