我一直在阅读 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
传递到类构造函数的参数中?
据我所知,属性 getter 不能有参数。而是写一个函数。
您可以通过一个返回中间对象的属性来实现此目的,该中间对象具有带有所需参数的 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(以及其他函数?)。这也可以防止错误(如果传入了错误的上下文怎么办?)。
您可以这样做:
val displayedValue: String by lazy {
val newString = context.getString(R.string.someString)
newString
}