如果我使用MutableSetwith 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")
}
}
Run Code Online (Sandbox Code Playgroud)
我将相同的值传递给LoginSavedCommand.Login,但MutableSet继续接受添加相同的值(在示例中println打印“不”,并且我需要打印“做”,因为我需要使用此来防止重复内容selaed class)
A通过使用 elements\'检查MutableSet来检查它是否包含元素,并且根据实现,. 例如,A用于存储和快速查找哈希表中的元素。equalshashCodeHashSethashCode
您的示例中的两个子类sealed class不会覆盖equals函数,因此提供默认的相等性检查实现,即身份相等(即一个对象仅等于其自身,并且不同的对象永远不会相等,即使它们的属性相等)。
为了实现LoginSavedCommand中项目的唯一性MutableSet,您需要确保子类提供适当的相等检查实现。
一个简单的方法是创建两个子类data classes,以便编译器根据属性生成equals和实现:hashCode
sealed class LoginSavedCommand {\n data class Login(val email: String, val password: String) : LoginSavedCommand()\n data class SaveData(val email: String, val password: String) : LoginSavedCommand()\n}\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n或者,在子类中手动重写equals和函数。hashCode
重要提示:equals重写这些函数时,请确保实现遵循和 的API 参考中描述的函数约定hashCode。
例如:
\n\nsealed class LoginSavedCommand {\n class Login(val email: String, val password: String) : LoginSavedCommand() {\n override fun equals(other: Any?): Boolean {\n if (this === other) return true\n if (javaClass != other?.javaClass) return false\n\n other as Login\n\n if (email != other.email) return false\n if (password != other.password) return false\n\n return true\n }\n\n override fun hashCode(): Int {\n var result = email.hashCode()\n result = 31 * result + password.hashCode()\n return result\n }\n }\n\n\n class SaveData(val email: String, val password: String) : LoginSavedCommand() {\n /* ... */\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n这些实现由 IntelliJ IDEA 使用类主体中的Generate...\xe2\x86\x92操作生成。equals() and hashCode()
| 归档时间: |
|
| 查看次数: |
1238 次 |
| 最近记录: |