在Kotlin中使用实用程序类(最佳方法)?

时间:2018-11-02 06:03:33

标签: kotlin

我正在玩Kotlin,并以不同的方式创建Util类。我正在通过 Kotlin或Java 进行效果最佳的方式。

现在,我创建了使用许多类型。现在我很困惑,哪个是最适合使用,最重要的是为什么?我正在考虑堆,内存,性能。找到最佳方法

我的问题对于你们来说可能看起来很愚蠢,但我迷宫般,无法亲自解决。

这是我的游乐场。

我已经创建了5个Kotlin文件。我在其中放入了 foo()方法。并尝试通过Kotlin和Java致电。

  

呼叫类别 Bar.kt

class Bar {
    fun bazz() {
        UtilClass.instance.foo()
        UtilClassObject.UtilClassObject.foo()
        UtilCompanionObject.foo()
        UtilFileObject.foo()
        foo() // from UtilFile
    }
}
  

调用类 Qux.java

public class Qux {
    public void bazz() {
        UtilClass.Companion.getInstance().foo();
        UtilClassObject.UtilClassObject.INSTANCE.foo();
        UtilFileKt.foo();
        UtilFileObject.INSTANCE.foo();
        UtilCompanionObject.Companion.foo();
    }
}

这是maze,让我感到困惑,无法选择最佳。

UtilClass.kt

class UtilClass {
    fun foo() { ... }

    companion object {
        val instance = UtilClass()
    }
}

UtilClassObject.kt

class UtilClassObject {
    object UtilClassObject {
        fun foo() { ... }
    }
}

UtilCompanionObject.kt

class UtilCompanionObject {
    companion object {
        fun foo() { ... }
    }
}

UtilFile.kt

fun foo(){ ... }

UtilFileObject.kt

object UtilFileObject {
    fun foo() { ... }
}

可能需要回答我的问题并很好地解释它。因此,我非常感谢您提前做出的努力。

1 个答案:

答案 0 :(得分:3)

Kotlin参考页上提供了所有选项,用于Kotlin和Java之间的互操作:https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html

您的选项可以从Java调用类MyUtil上的内容,并在不使用MyUtil.foo()之类的实例的情况下进行调用,那么您只需执行以下两个选项之一即可:

// smallest byte code, 
//   static invocation of foo() from Kotlin side,
//   also static call from Java to foo()
object MyUtil {
    @JvmStatic fun foo() { ... }
}

// creates two classes,
//    static lookup of companion followed by virtual call on that instance to foo() from Kotlin, 
//    Java is a static call to foo()
class MyUtil {
    companion object {
        @JvmStatic fun foo() { ... }
    }
}

您会在Kotlin MyUtil.foo()中使用相同的名称。具体来说,这是制作Kotlin method static的模型。

两个示例在Java中看起来都是相同的,因为它们只是对静态方法的直接静态调用。在Kotlin中,第一个示例也是静态调用,第二个示例首先查找同伴的实例,然后对该方法进行虚拟调用。第二个示例创建两个类,另一个示例仅创建一个类。

您提供的其他选项效率不高,语法也较难看。根据最小的字节码,最少的类和最快的性能,选择第一个示例,即仅1类和所有静态调用。