ID

@SerialName(value = "ID")
sealed class ID : Comparable<ID> , Cloneable(source)

唯一标识 ID.

一个 ID,其代表了两种数据:ID的类型,以及ID具体的值。

假若一个 ID 中实际存储的值仅有一个,则它的 toString 应当就是它的字面值。 通常情况下 ID 之间的相等判断即通过字面值进行。

ID可排序的

简单包装器

ID 是一种简单包装器类型,因此建议那些对外公开的 ID 属性使用 即用即造 的形式,即不会急切的初始化属性, 而是每次获取时临时创建。

例如:

val idContainer = ...

// 下面会产生3个ID对象
useID(idContainer.id)
useID(idContainer.id)
useID(idContainer.id)

也因此,大多数通过属性获取 ID 的情况下建议通过局部变量保存以复用。

val idContainer = ...
val id = idContainer.id

// 重复利用
useID(id)
useID(id)
useID(id)

序列化

ID 支持序列化, 且 ID 的序列化器应当都是一个 primitive 序列化器。 ID 序列化后都不应是结构体, 而是一个值类型。

例如:

@Serializable
data class User(val id: LongID, val name: String)

val json = Json.encodeToString(User(213L.ID, "ForteScarlet"))
// json: {"id": 213, "name": "ForteScarlet"}

而由于 ID 的最终序列化结果为值类型,因此在序列化是时使用 ID,需要使用一个具体的最终类型。

// 直接使用具体的ID类型,比如LongID
@Serializable
data class User(val id: LongID)

在某个可序列化类型中,对于一个ID字段,如果你希望能够保证它能够完全的正反序列化,并且你只关心它的字面量而不关系其他方面, 那么你可以考虑将此字段的序列化器标记为 ID.AsCharSequenceIDSerializer.

@Serializable
data class Example(
@Serializable(ID.AsCharSequenceIDSerializer::class)
val id: ID,
val name: String
)

此序列化其会永远将ID视为字符串作为序列化目标。

构造

ID 提供了名为 ID 的后缀扩展属性来将某个值构造为 ID 类型, 其中你需要关系的是几个常见的ID类型,即字符串类型和各整型类型的ID。

123.ID    // IntID
123L.ID // LongID
"str".ID // CharSequenceID
123u.ID // UInt.ID
val ul: ULong = 123u
ul.ID // ULongID

Java使用者可以通过 Identifies.ID(...) 来进行与上述类似的操作。

IntID          intId    = Identifies.ID(123);
LongID longId = Identifies.ID(123L);
CharSequenceID strId = Identifies.ID("str");

更多参考:

随机ID

如果你需要获取一个随机的ID,可以考虑使用 randomID. randomID 内使用 RandomIDUtil.randomID 生成一个 类UUID风格 的随机字符串并包装为 ID 并返回.

不过需要注意,这个随机ID返回的内容并非标准的HEX字符串或UUID字符串。

具体类型

ID 是一个抽象类型,有关其他具体实现类型参阅它们各自的说明。

属性委托

面向公开属性的场景 ID 提供了一些更简便的属性委托API来简化代码。

有关它们的说明参考

Author

ForteScarlet

See also

Inheritors

Constructors

Link copied to clipboard
protected constructor()

Types

Link copied to clipboard

将一个 ID 视为一个 CharSequenceID 进行序列化。

Link copied to clipboard
object Companion

Properties

Link copied to clipboard

ID的字面值。等同于 ID.toString.

Functions

Link copied to clipboard
protected open fun clone(): Any
Link copied to clipboard
abstract operator override fun compareTo(other: ID): Int

ID之间应当是可以排序的。

Link copied to clipboard
protected abstract fun doEquals(other: ID): Boolean
Link copied to clipboard
operator override fun equals(other: Any?): Boolean
Link copied to clipboard
abstract override fun hashCode(): Int
Link copied to clipboard

所有的ID都拥有转化为字符序列ID的能力。

Link copied to clipboard
abstract override fun toString(): String

IDtoString 结果必须是当前ID所对应的字面值。

Link copied to clipboard

尝试将当前ID转化为一个 Long

Link copied to clipboard

尝试将当前ID转为一个 LongID.

Link copied to clipboard

尝试将当前ID转为一个 NumericalID