Kotlin的实用工具课程

nho*_*ass 17 kotlin

在Java中,我们可以创建一个这样的utils类:

final class Utils {
    public static boolean foo() {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是如何在Kotlin做到这一点?

我尝试过使用里面的函数object:

object Utils {
    fun foo(): Boolean {
        return false
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当从Java代码调用此方法时,需要添加INSTANCE.例如:Utils.INSTANCE.foo().

然后我改为将其声明为顶级函数(不带classobject):

@file:JvmName("Utils")
@file:JvmMultifileClass

fun foo(): Boolean {
    return true
}
Run Code Online (Sandbox Code Playgroud)

然后我可以Utils.foo()从Java代码调用.但是从Kotlin代码我得到了Unresolved reference编译器错误.它只允许foo()直接使用功能(没有Utils).

那么在Kotlin中声明utils类的最佳方法是什么?请帮我!

zsm*_*b13 21

你提出的最后一个解决方案实际上在Kotlin中非常惯用 - 没有必要将你的函数放在任何东西中,顶级函数可以很好地用于实用程序,事实上,这就是大多数标准库所包含的.

您也@JvmName正确地使用了注释,这正是您应该如何使Java用户可以轻松调用这些顶级函数.

请注意,只有@JvmMultifileClass将顶级函数放在不同的文件中,但仍希望它们最终分组在同一个类文件中时才需要(同样,仅适用于Java用户).如果您只有一个文件,或者您为每个文件指定了不同的名称,则不需要此注释.


如果由于某种原因你想Utils.foo()在Java和Kotlin中使用相同的语法,那么使用a object和then @JvmStatic方法的解决方案就是这样做的方法,正如@marianosimone在这个答案中所示.

  • 来自@Roland 回答的附加信息:在 Kotlin 中使用“object”作为 utils 没有任何意义。这不是单例,对吧?谢谢你们\ (2认同)

mar*_*one 18

您需要@JvmStatic为此:

在科特林:

object Utils {
    @JvmStatic
    fun foo(): Boolean = true
}

val test = Utils.foo()
Run Code Online (Sandbox Code Playgroud)

在Java中:

final boolean test = Utils.foo()
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,可能是保持 Java 风格(`UtilsClass.utilsFunc()`)在 Kotlin 中不太好,因为 `UtilsClass` 部分是多余的吧? (2认同)
  • 即使在 Kotlin 中,我也是仍然喜欢命名对象的人之一。xD (2认同)