在 Kotlin 中为我创建的每个对象创建唯一 ID 的最佳方法是什么?

Dan*_*iel 6 kotlin

我的程序包括一个类:

class Player (private var playerName: String,
                  private var playerSkill: Int,
                  private var playerType: String) {


        var playerID = 0

      }
Run Code Online (Sandbox Code Playgroud)

当用户想要创建新玩家时,我正在实例化该对象,我的问题是为每个玩家创建唯一 ID(即playerID)的最佳方法是什么。例如,playerID[0] = 0,playerID[1] = 1 等等……目的是稍后将玩家存储在玩家数组中,并能够通过其 ID 获取每个玩家。

谢谢。

ser*_*0ne 7

您可以使用一些选项,但在我们讨论您的选项之前,请注意可变性!我注意到你的班级的所有属性都是可变的。除非有充分的理由,否则值得让它们保持不变;例如:

class Player (
    private val playerName: String,
    private val playerSkill: Int,
    private val playerType: String,
    val playerID: Int = 0,
)
Run Code Online (Sandbox Code Playgroud)

var请注意从(可变)到(不可变)的微妙变化val,并且这会将playerID属性移动到构造函数,而不是在创建播放器实例后设置值。

现在,您的选择...

1. 使用全局状态(可能是最糟糕的想法):

object GlobalState {
    private var value = 0;

    fun getNextInt(): Int = value++
}

val player = Player("John", 123, "SomePlayerType", GlobalState.getNextInt())
Run Code Online (Sandbox Code Playgroud)

这不是最好的主意的原因:

  1. 它依赖于全局状态(不好的做法)。
  2. 全局状态是可变的。
  3. 每次重新启动应用程序时,全局状态都会重置为零。

2.将playerID类型更改为UUID

UUID(通用唯一标识符)包含 128 位熵,通常认为随机 UUID 不太可能被创建两次(当然,有可能,只是不太可能)。

class Player (
    private val playerName: String,
    private val playerSkill: Int,
    private val playerType: String,
    val playerID: UUID = UUID.randomUUID(),
)

val player = Player("John", 123, "SomePlayerType")
Run Code Online (Sandbox Code Playgroud)

注意事项:

  1. 它不依赖于全局状态。
  2. 它们不会重置为零,因此比应用程序重新启动或使用持久性时更好。

3.使用数据类

数据类设计为当您的类具有值语义而不是行为语义时使用。他们为您实施equalshashCode为您服务。该实现的最佳效果是假设playerNameplayerSkillplayerType对于每个玩家来说都是唯一的:

data class Player (
    private val playerName: String,
    private val playerSkill: Int,
    private val playerType: String
) {
    val playerID: Int get() = hashCode()
}
Run Code Online (Sandbox Code Playgroud)

注意事项:

  1. 它不依赖于全局状态。
  2. 在你的班级中促进价值语义。
  3. 允许Player实例在集合中正常工作Set

4、UUID和数据类的组合(推荐):

data class Player (
    private val playerName: String,
    private val playerSkill: Int,
    private val playerType: String,
    val playerID: UUID = UUID.randomUUID(),
)
Run Code Online (Sandbox Code Playgroud)

注意事项:

  1. 它不依赖于全局状态。
  2. 在你的班级中促进价值语义。
  3. 允许 Player 实例在集合中正常工作Set
  4. 在应用程序重新启动和持久性下工作得很好。


小智 2

这是来自文档 var uniqueID = UUID.randomUUID().toString() https://developer.android.com/training/articles/user-data-ids