在不运行吸气剂的情况下访问Kotlin字段

问题描述 投票:2回答:3

我有一个包含MutableList的类,该类对该列表进行更改。我定义了一个吸气剂,以允许外部模块获取列表的副本。问题是,每当我访问该类中的字段时,最终都会更改列表副本而不是实际列表。如何在不通过定义的类中的getter的情况下访问列表?这是否被认为是不好的做法,如果可以,为什么?

class Server(private val port: Int): Runnable {

    val clients = mutableListOf<SocketChannel>()
        get() = field.toMutableList()


    private val sel = Selector.open()
    private val serverChannel = NIOServerChannel(port, sel).get()
    private val engine = ServerEngine(sel, clients)

    private val acceptor = ChannelAcceptor(serverChannel, clients)
    private val reader = ChannelReader()
    private val writer = ChannelWriter()
    private val middleware = Middleware()

    override fun run() {
        buildEngine()
        println("Starting server on port: $port")
        engine.run()
    }

    fun use(func: (String, Response) -> Unit) = middleware.add(BiConsumer(func))

    private fun buildEngine() {
        reader.process = middleware.get()

        engine.add(acceptor)
        engine.add(reader)
        engine.add(writer)
    }
}
kotlin encapsulation getter
3个回答
1
投票

访问自动创建的后备字段似乎没有任何约定。 Kotlin docs on backing fields声明一个显式支持属性:

private val _clients = mutableListOf<SocketChannel>()
val clients: MutableList<SocketChannel>
        get() = clients.toMutableList()

注意:我不喜欢这种语法,因为它强制您记住公开的字段(通过_前缀名称访问它们)。我可能会使用clientsInternal,所以我的IDE可以推荐它,并且我可以选择不带回溯的方式来添加_。


1
投票

问题是此行:get() = field.toMutableList()

查看definition of toMutableList:它将创建一个新集合。只需返回toMutableList或完全省略吸气剂即可。


0
投票

如果您的访问是单线程的,我认为您可以通过执行以下操作避免创建副本:

field
© www.soinside.com 2019 - 2024. All rights reserved.