如何在 Kotlin 中创建静态函数而不创建对象
Posted
技术标签:
【中文标题】如何在 Kotlin 中创建静态函数而不创建对象【英文标题】:How to create static functions in Kotlin without creating an object 【发布时间】:2021-08-13 03:34:56 【问题描述】:我希望拥有位于类中的函数(不污染全局命名空间)但可以静态访问(从不创建它们所在的对象)。 建议的解决方案:
object A
@JvmStatic
fun mkdir()
这是一个好的解决方案还是会不可避免地创建一个对象?我应该使用哪种模式?
【问题讨论】:
***函数不会污染全局命名空间——只污染文件所在包的命名空间。 而且object
关键字不会提示您这是否使用对象?另外,你检查过manyexistingquestionsaboutstaticsin Kotlin吗?
@gidds "顶层函数不会污染全局命名空间" 正点,我的意思是你不一眼就知道函数在哪里,除非你添加部分的包到调用。关于现有问题:他们只是给出标准对象模式,似乎总是创建一个单例
这能回答你的问题吗? What is the equivalent of Java static methods in Kotlin?
伴生对象会创建新的底层对象吗?
@EmmanuelMess companion object
s 是 object
s。 Kotlin 中的 object
声明被转换为具有静态初始化唯一实例的常规类。使用@JvmStatic
,方法mkdir
将是静态的,但是在初始化类时仍然会创建唯一实例。对于单例的创建,您到底关心什么?
【参考方案1】:
不幸的是,目前没有办法在 Kotlin 中的类上创建一个不会导致 Object(伴生对象)实例化的静态函数。如果你想这样做,你必须用 Java 编写它并从 Kotlin 中调用它。
@JvmStatic
注释在 JVM 字节码中创建一个静态方法,但所做的只是检索伴随对象的实例并调用其上的方法,您可以通过反编译生成的字节码来验证。
【讨论】:
Proguard 是否删除未使用的实例化?以上是关于如何在 Kotlin 中创建静态函数而不创建对象的主要内容,如果未能解决你的问题,请参考以下文章
如何在 QML 中访问 C++ 类对象,而不是在 QML 中创建单独的对象?
如何在没有初始化和特定数量元素的情况下在 Kotlin 中创建对象数组?
如何仅通过提供大小来像在 Java 中一样在 Kotlin 中创建数组?