在Java中,我们可以创建一个如下的实用程序类:
final class Utils {
public static boolean foo() {
return false;
}
}
但是如何在Kotlin中做到这一点?
我尝试在object
内部使用函数:
object Utils {
fun foo(): Boolean {
return false
}
}
但是,当从Java代码中调用此方法时,它需要添加INSTANCE
。例如:Utils.INSTANCE.foo()
。
然后我将其声明为顶级函数(没有class
或object
):
@file:JvmName("Utils")
@file:JvmMultifileClass
fun foo(): Boolean {
return true
}
然后我可以从Java代码调用Utils.foo()
。但是从Kotlin代码中,我得到了Unresolved reference
编译器错误。只能直接使用foo()
函数(不带Utils
前缀)。
那么在Kotlin中声明utils类的最佳方法是什么?我是新手,请帮帮我!
答案 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本身中,它们只是功能。
有些人甚至将实用程序类计入反模式。另一方面,没有类或对象的名称反而是没有多大意义的,函数是完全有意义的。