Kotlin属性与吸气剂。我可以不指定初始值吗?

时间:2018-01-09 07:17:52

标签: android kotlin singleton

我想创建一个单例类,但不幸的是,Android几乎需要几乎任何东西,所以我需要它来创建一个实例。所以我假设用户名为init(),然后返回实例。如下所示,如果_instance为null,则抛出异常,因此get方法不能返回null。

但Kotlin说我必须初始化instance。事情是,没有上下文就无法创建MyClass。所以我不想指定初始值。我怎么能这样做?

companion object
{
    protected var _instance:MyClass? = null;
    fun init(context:Context)
    {
        _instance = MyClass(context)
    }
    var instance:MyClass //<---This causes a compile error.
        get()
        {
            if(_instance==null) throw RuntimeException("Call init() first.");
            return _instance!!;
        }
}

2 个答案:

答案 0 :(得分:4)

var更改为val,它应该有效:

....
val instance: MyClass
....

变量属性(var)不仅假定是getter,还是setter。由于您未提供setter,因此生成了一个默认值set(value) { field = value }。尽管在这种情况下无用,但默认的setter使用field,因此需要初始化。

答案 1 :(得分:1)

使用lateinit属性

public class MyTest {
        lateinit var subject: TestSubject

        fun setup() {
            subject = TestSubject()
        }

        fun test() {
            subject.method()
        } 
}