Kotlin 接口可以缓存值吗?

Ada*_*hes 1 java observable kotlin

我真的很喜欢在 Kotlin 中使用接口的默认实现,尤其是像 Observable 这样的常见模式。这是我的界面,

interface Observable<T>{

    // How do I cache this?
    val observers: MutableList<Observer<T>>
        get() = LinkedList<>()

    fun addObserver(o:Observer<T>){
        observers.add(o)
    }

    fun removeObserver(o:Observer<T>){
        observers.remove(o)
    }

    fun notifyObservers(u:T){
        for (o in observers){
            o.update(u)
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

该接口引用了 的列表observers,但调用每次get()都会返回一个新的。LinkedList()如何缓存 的值observers以便仅创建一次?我尝试过使用kotlin-lazy,但要么无法获得正确的语法,要么它不适用于接口。我的 IDE 抱怨“接口中不允许使用委托属性。”

更新

根据 Yoav 的回答,我已将界面更改为

interface Observable<T>{
    val observers: MutableList<Observer<T>>
}
Run Code Online (Sandbox Code Playgroud)

然后在实现类中,

class MyObservable : Observable<String>

   private val _observers = LinkedList<Observer<String>>()

   override val observers: MutableList<Observer<String>>
       get() = _observers
Run Code Online (Sandbox Code Playgroud)

有什么技巧可以让这个更简洁吗?

Yoa*_*erg 5

根据 Kotlin 文档:

Kotlin 中的接口与 Java 8 非常相似。它们可以包含抽象方法的声明以及方法实现。它们与抽象类的不同之处在于接口不能存储状态。

接口不能保存任何状态,因为它们是完全抽象的。也许您应该使用 anabstract class来缓存这些值?

有关接口无状态原因的更多信息,请参阅此问题。

接口是一个契约,指定其实现者承诺能够执行的操作。它不需要指定状态,因为状态是一个实现细节,仅用于约束实现者如何履行此合同。如果您想指定状态,您可能需要重新考虑接口的使用并查看抽象基类。