我正在玩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() { ... }
}
可能需要回答我的问题并很好地解释它。因此,我非常感谢您提前做出的努力。
答案 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类和所有静态调用。