在Kotlin中向自定义getter传递参数

guz6ccqo  于 2023-01-05  发布在  Kotlin
关注(0)|答案(3)|浏览(149)

我一直在阅读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传递到类构造函数的参数中?

j5fpnvbx

j5fpnvbx1#

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

gdx19jrr

gdx19jrr2#

为此,可以使用一个属性,该属性返回一个中间对象,该中间对象包含带有所需参数的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]
e5njpo68

e5njpo683#

例如,您可以执行以下操作:

val displayedValue: String by lazy {
     val newString = context.getString(R.string.someString)
     newString
}

相关问题