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

Khe*_*raj 4 kotlin

我在玩Kotlin,并以不同的方式创建Util类。我正在寻找一种适合Kotlin或Java调用的方法

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

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

这是我的游乐场。

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

调用类Bar.kt

class Bar {
    fun bazz() {
        UtilClass.instance.foo()
        UtilClassObject.UtilClassObject.foo()
        UtilCompanionObject.foo()
        UtilFileObject.foo()
        foo() // from UtilFile
    }
}
Run Code Online (Sandbox Code Playgroud)

调用类Qux.java

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

这里是迷宫,这让我感到困惑,选择最好的。

UtilClass.kt

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

    companion object {
        val instance = UtilClass()
    }
}
Run Code Online (Sandbox Code Playgroud)

UtilClassObject.kt

class UtilClassObject {
    object UtilClassObject {
        fun foo() { ... }
    }
}
Run Code Online (Sandbox Code Playgroud)

UtilCompanionObject.kt

class UtilCompanionObject {
    companion object {
        fun foo() { ... }
    }
}
Run Code Online (Sandbox Code Playgroud)

UtilFile.kt

fun foo(){ ... }
Run Code Online (Sandbox Code Playgroud)

UtilFileObject.kt

object UtilFileObject {
    fun foo() { ... }
}
Run Code Online (Sandbox Code Playgroud)

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

Jay*_*ard 5

所有选项都在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() { ... }
}
Run Code Online (Sandbox Code Playgroud)

要么

// 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() { ... }
    }
}
Run Code Online (Sandbox Code Playgroud)

在Kotlin中,您也可以这样称呼MyUtil.foo()。具体来说,这是使Kotlin方法静态化的模型。

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

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

  • @JaysonMinard Kotlin中实际推荐的方法是既不执行您建议的任何操作,而改用顶级函数。这没有开销,是Kotlin上最容易使用的,并且所需的代码最少。 (5认同)