gpt4 book ai didi

oop - 抽象类与 Lambda 参数

转载 作者:行者123 更新时间:2023-12-02 13:15:22 25 4
gpt4 key购买 nike

由于 kotlin 对 lambda 有很好的支持,我开始使用 lambda 作为 abstract 的构造函数参数。类而不是声明 abstract val/fun .

我认为它更简洁,尤其是因为 val类型得到推断。

这有什么缺点?

abstract class AbstractListScreen<T> (
val data: Set<T>,
val filterators: (T) -> Set<String>
) {

fun open() {
/* ... */
}
}

class OrderListScreen : AbstractListScreen<Data>(data = setOf(),
filterators = { setOf(it.toString()) }
) {

fun someEvent() {
/* ...*/
}
}

最佳答案

  • 在您的示例中,OrderListScreen 的每个实例将创建自己的filterators函数类型的实例 (T) -> Set<String> .与在编译时存储在类型定义中的抽象函数及其覆盖相比,这在内存和性能方面都有额外的运行时开销。
  • 默认过滤器可以存储在属性中以减少此运行时开销:
    class OrderListScreen : AbstractListScreen<Data>(data = setOf(),
    filterators = defaultFilterators
    ) {
    companion object {
    val defaultFilterators: (Data) -> Set<String> = { setOf(it.toString()) }
    }

    fun someEvent() {
    /* ...*/
    }
    }

    但是,OrderListScreen 的每个实例仍然会引用 defaultFilterators这仍然是额外的运行时开销(尽管除非你有很多这些类型的实例,否则它是微不足道的)。
  • Function types(T) -> Set<String>可能具有命名参数(例如 (element: T) -> Set<String> ),但目前诸如 IntelliJ IDEA 之类的 IDE 不在生成的文档或代码 stub 中使用这些命名参数,因此在子类化等时此类信息会丢失。IDE 确实在生成的文档和代码 stub 中使用命名参数用于抽象函数。
  • 您不能(当前)将文档直接与可以对抽象函数执行的函数类型参数相关联。

  • 当尝试考虑运行时开销时,使用抽象函数时代码看起来并没有太大不同,运行时开销被消除,并且当前 IDE 对生成的代码 stub 、文档等的支持得到了改进:
    abstract class AbstractListScreen<T>(val data: Set<T>) {
    abstract fun filterators(element: T): Set<String>

    fun open() {
    /* ... */
    }
    }

    class OrderListScreen : AbstractListScreen<Data>(data = setOf()) {
    override fun filterators(element: Data): Set<String> = setOf(element.toString())

    fun someEvent() {
    /* ...*/
    }
    }

    关于oop - 抽象类与 Lambda 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38846255/

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