当前位置: 首页 > 知识库问答 >
问题:

Kotlin实现具有更新能力的惰性var的最佳方法

丌官坚秉
2023-03-14

用惰性初始化、私有setter和使用昂贵的方法更改值的能力来实现变量的最佳方法是什么?

private const val NO_INIT = "noInit"

class LazyUpdatableVarClass {
    private val initValue by lazy { expensive() }
    var value = NO_INIT
        private set
        get() {
            if (field == NO_INIT) {
                field = initValue
            }
            return field
        }

    fun updateValue() {
        value += expensive()
    }

    private fun expensive() = "hello"
}

用法示例:

val example = LazyUpdatableVarClass()
assertEquals("hello", example.value)
example.updateValue()
assertEquals("hellohello", example.value)

共有1个答案

西门逸仙
2023-03-14

针对可变的自定义委托对您没有帮助,因为您不能将私有setter(或任何自定义setter/getter)与委托一起使用。

实现此API的更简洁的方法是将value声明为val,并使用可变备份属性(_value):

class LazyUpdatableVarClass {
    private lateinit var _value: String
    private fun getValueOrInit(): String {
        if (!::_value.isInitialized) _value = expensive()
        return _value
    }

    fun updateValue() {
        _value = getValueOrInit() + expensive()
    }

    val value get() = getValueOrInit()

    private fun expensive() = "hello"
}
 类似资料:
  • 问题内容: 我在Sun的JRE6中运行Tomcat6,每部署两个,我都会收到OutOfMemoryException:PermGen。我已经完成了对PermGen解决方案的搜索,并尝试了许多修复程序。没有工作。我读了很多有关Oracle JRockit的好东西,以及它的PermGen分配大小(与Sun的128M相比),虽然它不能解决问题,但我可以在PermGen异常之间重新部署100次,相比之下2

  • Overview This article discusses performance and reliability best practices for Express applications deployed to production. This topic clearly falls into the “devops” world, spanning both traditional

  • 性能与体验是前端的核心竞争力,是最直观反应页面是否好用、易用的标准。用户花在页面上的时间不应该是在等待页面加载和响应,而是使用和顺畅浏览的时间,因此如何提升页面性能和体验,让页面更快的可交互、浏览滚动更顺畅,是需要你持续的研究、优化、推进的。在 Rax 不断应用发展以及成熟的过程中,沉淀总结了一系列的性能体验的措施和最佳实践,通过这些,可以帮助你大幅提高页面的各项性能。 加载性能 统计口径 加载性

  • 问题内容: 我们如何确定用于集合的方法的最佳实现(假设equals方法已被正确覆盖)? 问题答案: 最好的实现?这是一个难题,因为它取决于使用模式。 在几乎所有情况下,Josh Bloch的 有效Java项目8(第二版)中都提出了合理的良好实现。最好的办法是在那里查找,因为作者在那里解释了为什么这种方法很好。 简短版 1. 创建一个并分配一个非零值。 对于在方法中测试的每个字段 f,通过以下equ

  • 问题内容: 我有的: 有什么问题: 问题是,在会话关闭后,我无法拉动惰性收集。但是我也无法在 proceed 方法中关闭会话。 什么解决方案(粗略解决方案): a)在会话关闭之前,强制hibernate以拉动惰性集合 .... b)也许更轻松的方法是使用注释 题: 什么是最佳做法/常见方式/更轻松的方式?意味着将我的对象转换为JSON。 问题答案: 在内部使用初始化惰性对象。 现在,在Transa

  • 我有几个不同的路由,但包含相似的参数。 示例: 请注意,所有三个视图都使用相同的图表控制器来控制视图。这是一个相当通用的控制器,但它需要在可用的图表类型之间切换。。。同时保持路线的其余部分<示例:(这不起作用) 有人知道如何在不完全重新键入或重建路由路径的情况下轻松更新路由参数吗?