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

时间:2018-10-09 05:37:11

标签: kotlin

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

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

fun refresh() {
    viewAlpha = 255
    invalidate()
}

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

  

原因:java.lang.StackOverflowError:堆栈大小8MB

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

1 个答案:

答案 0 :(得分:4)

一种方法是为您提供良好的支持,以摆脱二传手的循环:

private var _viewAlpha = 255

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

fun refresh() {
    _viewAlpha = 255
    invalidate()
}

如果您想简化多个字段的逻辑,则可以将此实现抽象为单独的类,并使用具有直接设置方法的回调调用,该调用方法无需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)