【问题标题】:Utils class in KotlinKotlin 中的 Utils 类
【发布时间】:2018-08-12 17:48:41
【问题描述】:

在 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 类的最佳方法是什么?

【问题讨论】:

  • 这个问题出名了,我发了一篇文章here

标签: kotlin


【解决方案1】:

您需要为此使用@JvmStatic

在 Kotlin 中:

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

val test = Utils.foo()

在 Java 中:

final boolean test = Utils.foo()

【讨论】:

  • 谢谢,可能是保持 Java 风格 (UtilsClass.utilsFunc()) 在 Kotlin 上不太好,因为 UtilsClass 部分是多余的吧?
  • 嗯,在这一点上几乎是品味/风格的问题。正如@zsmb13 指出的那样,您可以使用@JvmName 在Java 中获取该语法,并使用Kotlin 中的顶级声明。即使在 Kotlin 中,有些人仍然更喜欢命名对象,因为它在多语言项目中提供了更一致的风格。
  • 我是即使在 Kotlin 中仍然更喜欢命名对象的人之一。 xD
【解决方案2】:

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

您也以正确的方式使用了@JvmName 注释,这正是您应该使这些顶级函数易于Java 用户调用的方式。

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


如果出于某种原因您希望在 Java 和 Kotlin 中使用相同的 Utils.foo() 语法,则每个方法使用 object@JvmStatic 的解决方案就是这样做的方法,正如 @marianosimone 在 @ 987654321@.

【讨论】:

  • 来自@Roland 的附加信息 回答:在 Kotlin 中使用 object 用于 utils 没有任何意义。这不是单例,对吧?谢谢大家\
【解决方案3】:

请注意,您在 Java 中使用的 util 类是为不属于特定类型或对象的任何内容提供附加功能的唯一方法。在 Kotlin 中使用 object 没有任何意义。这不是单例,对吧?

您提到的第二种方法是实用功能的方法。在内部,此类函数被转换为静态函数,并且您可以看到它们成为您正在搜索的 Java 中的静态 util 类,因为在没有类或枚举的情况下,您无法在 Java 中拥有独立的函数。然而,在 Kotlin 本身中,它们只是函数。

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

【讨论】:

  • 我熟悉 Java 风格 (UtilsClass.utilsFunc()),它将 utils 函数与同一个类具有相对意义(便于管理)。但在 Kotlin 中这不是一个好方法,对吧?
  • 是的。在 Java 中你没有其他方法可以提供这些功能,而在 Kotlin 中你有。在 Java 中,您至少可以使用静态导入来隐藏实用程序类名称,然后 Java 中的用法与 Kotlin 中的用法相同。这可能是比其他方式更好的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-07
  • 1970-01-01
  • 2019-01-20
相关资源
最近更新 更多