我有一个接口,我想要一个可以在类内部修改但不能在外部修改的属性.我不能使用val,因为它需要是可变的,并且var关键字不能有指定的私有setter,因为它在接口中.

In Java I would have done this:

public <T> getMyProperty();

我可以在Kotlin中使用相同的方法,只需直接编写getter函数,但这看起来不像是一种类似Kotlin的方法.有没有更好的方法来实现同样的目标呢?

fun getMyProperty()

推荐答案

In Kotlin, you can actually override a val with a var, so, I think, what you want can be expressed as follows:

interface Iface {
    val foo: Foo
}

class Impl : Iface {
     override var foo: Foo
         get() = TODO()
         private set(value) { TODO() } 
}

或者,您可以使用带有后备字段和默认访问器的属性覆盖val:

class ImplDefaultGetter : Iface {
    override var foo: Foo = someFoo
        private set
}

In both cases, the mutability and the presence of a private setter become an implementation detail of the classes and are not exposed through the interface.

Kotlin相关问答推荐

Gradle Jooq配置自定义生成器

将基于注册的服务转换为流

新的jOOQ Gradle插件无法正确处理自引用关系

Kotlin中一个接口的实现问题

可以在没有导入声明的情况下调用 Kotlin 扩展函数吗?

如何使用子变量在 Kotlin 中初始化父级

如何在 Kotlin 中不受约束?

如何为 Kotlin 中的每个循环设置以避免越界异常

为什么在 Kotlin 中调用私有构造函数会导致错误为无法访问 是什么?

Kotlin 具体类从抽象类和接口扩展而来,接口使用抽象类中实现的方法

Kotlin:查找集合中最常见的元素

如何使用 Hilt 注入应用程序:ViewModel 中的上下文?

在 SplashActivity 中显示的 Firebase 应用内消息.如何在 MainActivity 中显示它?

Kotlin 解构超过五个组件

如何从 Firestore 查询中排除元素?

片段内的 Kotlin 按钮 onClickListener 事件

任何处理器都无法识别以下选项:'[kapt.kotlin.generated, room.incremental]'

我应该使用Kotlin数据类作为JPA实体吗?

lateinit 的 isInitialized 属性在伴随对象中不起作用

Kotlin中的函数接口