科特林的实用程序类

时间:2018-08-12 17:48:42

标签: kotlin

在Java中,我们可以创建一个如下的实用程序类:

final class Utils {
    public static boolean foo() {
        return false;
    }
}

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


我尝试在object内部使用函数:

object Utils {
    fun foo(): Boolean {
        return false
    }
}

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


然后我将其声明为顶级函数(没有classobject):

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

fun foo(): Boolean {
    return true
}

然后我可以从Java代码调用Utils.foo()。但是从Kotlin代码中,我得到了Unresolved reference编译器错误。只能直接使用foo()函数(不带Utils前缀)。


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

3 个答案:

答案 0 :(得分:13)

您提出的最后一个解决方案在Kotlin中实际上是相当惯用的-无需将函数范围限定在任何东西内,顶级函数可以很好地用于实用程序,实际上,这就是大多数标准库所包含的内容。

您也正确地使用了@JvmName注释,这正是使Java用户可以轻松调用这些顶级函数的方式。

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


如果出于某种原因,您想要在Java和Kotlin中使用相同的Utils.foo()语法,则解决方法是先使用object然后再使用@JvmStatic由@marianosimone在this answer中显示。

答案 1 :(得分:6)

您需要为此使用@JvmStatic

在科特林:

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

val test = Utils.foo()

在Java中:

final boolean test = Utils.foo()

答案 2 :(得分:2)

请注意,在Java中使用的util类是在那里提供附加功能的唯一方法,适用于不属于特定类型或对象的任何东西。在Kotlin中为此使用object没有任何意义。不是单身人士,对吧?

您提到的第二种方法是实用程序功能。在内部,此类函数会转换为静态函数,并且您可以看到它们变成了您要搜索的Java中的静态util类,因为在Java中没有类或枚举就无法拥有独立的函数。但是在Kotlin本身中,它们只是功能。

有些人甚至将实用程序类计入反模式。另一方面,没有类或对象的名称反而是没有多大意义的,函数是完全有意义的。