代码之家  ›  专栏  ›  技术社区  ›  Rafał Kuźmiński

我们真的需要避免在Kotlin中使用具有片段和活动默认值的构造函数吗?

  •  2
  • Rafał Kuźmiński  · 技术社区  · 7 年前

    我非常喜欢Kotlin,它让我们可以编写更好的代码。最好的特性之一是接口实现委托,它看起来如下:

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

    someObject 必须是singleton(对象),必须在关键字之后使用构造函数创建 by (但是你不能提及它,或者也许有人知道怎么做?)或者必须在构造函数中提供。

    在Android混乱和糟糕的世界中,由于配置更改,我们不鼓励在片段和活动中使用构造函数。但是这个呢:

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

    我试图更改配置和事件,我允许系统终止我的应用程序,但是,一切看起来都很好,我的对象用我的片段一次又一次地创建。这是有效的,还是我遗漏了什么? 大家好!

    1 回复  |  直到 7 年前
        1
  •  2
  •   Alexey Soshin    7 年前

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

    但是Kotlin在幕后实现默认参数值的方法是创建额外的构造函数。您可以反编译您的类,并看到它现在包含两个构造函数,一个接收 someObject ,还有一个空的。

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

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

    调用它将用实现类的新实例填充片段。