将参数传递给 kotlin 中的自定义 getter

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

我一直在阅读 Kotlin 中的 properties,包括自定义 getter 和 setter。

但是,我想知道是否可以创建带有额外参数的自定义 getter。

例如,考虑 Java 中的以下方法:

public String getDisplayedValue(Context context) {
    if (PrefUtils.useImperialUnits(context)) {
        // return stuff
    } else {
        // return other stuff
    }
}

请注意,

PrefUtils
中的静态方法必须有
Context
作为参数,因此不能删除它。

我想用 Kotlin 这样写:

val displayedValue: String
    get(context: Context) {
        return if (PrefUtils.useImperialUnits(context)) {
            // stuff
        } else {
            // other stuff
        }
    }

但我的 IDE 以红色突出显示所有这些。

我知道我可以在类中创建一个函数来获取显示的值,但这意味着我也必须在 Kotlin 中使用

.getDisplayedValue(Context)
,而不是像
.displayedValue
中那样能够按名称引用属性.

有没有办法创建这样的自定义 getter?

编辑:如果没有,最好为此编写一个函数,或者将

Context
传递到类构造函数的参数中?

kotlin
3个回答
27
投票

据我所知,属性 getter 不能有参数。而是写一个函数。


1
投票

您可以通过一个返回中间对象的属性来实现此目的,该中间对象具有带有所需参数的 get 和/或 set 运算符,而不是直接返回值。

让中间对象成为内部类实例可能有助于轻松访问父对象。但是,在接口中您不能使用内部类,因此在这种情况下,您可能需要在构造中间对象时提供引用父对象的显式构造函数参数。

例如:

class MyClass {
    inner class Foo {
        operator fun get(context: Context): String {
            return if (PrefUtils.useImperialUnits(context)) {
                // return stuff
            } else {
                // return other stuff
            }
        }
    }
    val displayedValue = Foo()
}

...
val context : Context = whatever
val mc : MyClass = whatever
val y: String = mc.displayedValue[context]

但是,如果我知道特定上下文的生命周期比依赖于它的任何 MyClass 实例的生命周期长,并且特定上下文始终必须传递到特定 MyClass 实例的属性中,我可能会认真考虑将 MyClass 实例与其构造函数中的上下文关联起来,这样我就不需要在每次需要时将上下文传递给 getter 和 setter(以及其他函数?)。这也可以防止错误(如果传入了错误的上下文怎么办?)。


-3
投票

您可以这样做:

val displayedValue: String by lazy {
     val newString = context.getString(R.string.someString)
     newString
}
© www.soinside.com 2019 - 2024. All rights reserved.