如果我将MutableSet
与sealed class
一起使用,则MutableSet
会接受所有重复的内容。
示例:
sealed class LoginSavedCommand {
class Login(val email: String, val password: String) : LoginSavedCommand()
class SaveData(val email: String, val password: String) : LoginSavedCommand()
}
fun main(args: Array<String>) {
val mSet: MutableSet<LoginSavedCommand> = hashSetOf()
mSet.add(LoginSavedCommand.Login("oba", "pass"))
mSet.add(LoginSavedCommand.Login("faiii", "blabla"))
if (mSet.add(LoginSavedCommand.Login("oba", "pass"))) {
println("don't")
} else {
println("do")
}
}
我将相同的值传递给LoginSavedCommand.Login
,但是MutableSet
继续接受添加相同的值(在示例println
上打印“不”,我需要打印“ ”,因为我需要使用此selaed class
)
答案 0 :(得分:4)
MutableSet
通过使用元素的equals
checks以及是否使用hashCode
来检查它是否包含元素。例如,HashSet
使用hashCode
来存储并快速查找哈希表中的元素。
示例中sealed class
的两个子类不会覆盖equals
函数,因此提供了默认的相等性检查实现,即身份相等性(即,一个对象仅等于其自身,并且不同的对象即使属性相等也永远不会相等。
要在LoginSavedCommand
中实现MutableSet
个项目的唯一性,您需要确保子类提供适当的相等性检查实现。
一种简单的方法是make both subclasses data class
es,以便编译器根据以下属性生成equals
和hashCode
实现:
sealed class LoginSavedCommand {
data class Login(val email: String, val password: String) : LoginSavedCommand()
data class SaveData(val email: String, val password: String) : LoginSavedCommand()
}
或者,在子类中手动覆盖equals
和hashCode
函数。
重要提示::覆盖这些功能时,请确保实现遵循equals
和hashCode
的API参考中描述的功能约定。
例如:
sealed class LoginSavedCommand {
class Login(val email: String, val password: String) : LoginSavedCommand() {
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as Login
if (email != other.email) return false
if (password != other.password) return false
return true
}
override fun hashCode(): Int {
var result = email.hashCode()
result = 31 * result + password.hashCode()
return result
}
}
class SaveData(val email: String, val password: String) : LoginSavedCommand() {
/* ... */
}
}
这些实现是由IntelliJ IDEA使用类主体中的Generate...
→equals() and hashCode()
操作生成的。