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 获取每个玩家。
谢谢。
您可以使用一些选项,但在我们讨论您的选项之前,请注意可变性!我注意到你的班级的所有属性都是可变的。除非有充分的理由,否则值得让它们保持不变;例如:
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)
这不是最好的主意的原因:
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)
注意事项:
3.使用数据类
数据类设计为当您的类具有值语义而不是行为语义时使用。他们为您实施equals并hashCode为您服务。该实现的最佳效果是假设playerName、playerSkill和playerType对于每个玩家来说都是唯一的:
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)
注意事项:
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)
注意事项:
Set。小智 2
这是来自文档
var uniqueID = UUID.randomUUID().toString()
https://developer.android.com/training/articles/user-data-ids
| 归档时间: |
|
| 查看次数: |
11928 次 |
| 最近记录: |