gpt4 book ai didi

kotlin - 在 map 上迭代时删除

转载 作者:行者123 更新时间:2023-12-02 13:06:58 26 4
gpt4 key购买 nike

想象一下以下界面:

interface IConnectionManager {
fun connect(connection: Int)
fun disconnect(connection: Int)
fun disconnectAll()
}
简单的实现可能如下所示:
class ConnectionManager: IConnectionManager {
private val connections = mutableMapOf<Int, String>()

override fun connect(connection: Int) {
connections[connection] = "Connection $connection"
}

override fun disconnect(connection: Int) {
connections.remove(connection)?.let {
println("Closing connection $it")
}
}

override fun disconnectAll() {
connections.forEach {
disconnect(it.key)
}
}
}
现在您可能已经看到了问题。每当我调用 disconnectAll()时,我都会得到 ConcurrentModificationException
Demo
我知道并理解为什么(重复)。但是我无法找到一种方法来实现这些 disconnect()disconnectAll()方法。
我有一些想法,其中一些甚至可行,但是它们很丑陋,并且可能在其他地方引起错误:
  • disconnectAll()中,复制connections.keys并使用它。这可行,但是当其他一些线程想要添加新连接时,显然可能会导致问题。
  • 将迭代器对象从disconnectAll()传递到新的disconnect(iterator)。看起来很丑陋,并且导致代码重复,但我无法使其正常工作。
  • 制作不会从集合中删除连接的private closeConnection(connection: Int),并从disconnect()disconnectAll()函数中调用它。这实际上可能是最好的解决方案,但我还没有尝试过。

  • 还是还有其他更优雅的Kotlin解决方案?

    最佳答案

    Make private closeConnection(connection: Int) which wil not remove theconnection from collection, and call it from both disconnect() anddisconnectAll() functions. This might actualy be the best solution,but I didn't tried it yet.


    这将是我的强烈建议。将实际的断开逻辑与管理注册哪些连接的逻辑分开。就像是:
    class ConnectionManager: IConnectionManager {
    private val connections = mutableMapOf<Int, String>()

    override fun connect(connection: Int) {
    connections[connection] = "Connection $connection"
    }

    override fun disconnect(connection: Int) {
    if (connection in connections) {
    closeConnection(connection)
    connections.remove(connection)
    }
    }

    override fun disconnectAll() {
    connections.keys.forEach(::closeConnection)
    connections.clear()
    }

    private fun closeConnection(connection: Int) {
    println("Closing connection $connection")
    }
    }

    关于kotlin - 在 map 上迭代时删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62954814/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com