如何在不调用其 setter 和 getter 的情况下访问 kotlin 中的变量

Shu*_*ubh 2 kotlin

我正在开发一个库,其中参数的任何更改都会刷新视图。在refresh()函数中,我将一些参数的值设置为默认值。

var viewAlpha= 255
        set(value) {
            field = value
            refresh()
        }

fun refresh() {
    viewAlpha = 255
    invalidate()
}
Run Code Online (Sandbox Code Playgroud)

由于明显的原因,这会导致 StackOverflowError。

引起:java.lang.StackOverflowError: stack size 8MB

当我们在同一个类中访问它时,是否可以在不调用其 setter 的情况下访问 kotlin 中的变量。类似于我们在java中所做的。

TSB*_*99X 5

一种方法是为您提供良好的支持字段以摆脱 setter-refres 循环:

private var _viewAlpha = 255

var viewAlpha
        get() {
            return _viewAlpha
        }
        set(value) {
            _viewAlpha = value
            refresh()
        }

fun refresh() {
    _viewAlpha = 255
    invalidate()
}
Run Code Online (Sandbox Code Playgroud)

如果您想简化多个字段的逻辑,您可以将此实现抽象为单独的类,并使用带有直接 setter 的回调调用,无需refresh调用即可工作。像这样:

class Field(val onSetCb: (Field) -> Unit) {

    private var viewAlpha = 255

    fun get() {
        return viewAlpha
    }

    fun set(value: Int) {
        setDirect(value)
        onSetCb(this)
    }

    fun setDirect(value: Int) {
        viewAlpha = value;
    }
}

// Elsewhere...

fun refresh(field: Field) {
    field.setDirect(255)
    invalidate()
}

val f = Field(::refresh)
f.set(255)
Run Code Online (Sandbox Code Playgroud)