我们真的需要避免为Kotlin中的Fragments和Activites使用默认值的构造函数吗?

时间:2018-08-07 19:08:39

标签: android kotlin delegates

我是Kotlin的忠实粉丝,以及它如何使我们编写更好的代码。最好的功能之一是接口实现委托,如下所示:

class A(val someObject:SomeInterface) : SomeInterface by someObject

someObject必须是单例(对象),必须在关键字by之后使用构造函数创建(但是您不能引用它,或者有人知道如何做到这一点?)或必须在构造函数中提供。

在Android混乱不堪的世界中,由于配置更改,我们不建议在片段和活动中使用构造函数。但是呢:

class MyFragment(val someObject:SomeInterface = SomeObjectImpl()):Fragment,SomeInterface by someObject

我试图更改配置和事件,允许系统终止我的应用程序,但一切仍然正常,我的对象正在用片段一次又一次地创建。这是有效的,还是我遗漏了一些东西? 大家好,科特林!

1 个答案:

答案 0 :(得分:2)

这是有效的。不鼓励您重载片段构造函数的原因是Android可以重新创建它们,并且它将使用默认的一个:MyFragment()

但是Kotlin在幕后实现默认参数值的方法是通过创建其他构造函数。您可以反编译您的类,现在看到它包含两个构造函数,一个构造函数接收someObject,另一个构造函数为空。

从JVM的角度来看,空的构造函数将如下所示:

public A() {
  this(new SomeObjectImpl());
}

调用它会在片段中填充已实现类的新实例。