如何在 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 objects 是 objects。 Kotlin 中的 object 声明被转换为具有静态初始化唯一实例的常规类。使用@JvmStatic,方法mkdir 将是静态的,但是在初始化类时仍然会创建唯一实例。对于单例的创建,您到底关心什么? 【参考方案1】:

不幸的是,目前没有办法在 Kotlin 中的类上创建一个不会导致 Object(伴生对象)实例化的静态函数。如果你想这样做,你必须用 Java 编写它并从 Kotlin 中调用它。

@JvmStatic 注释在 JVM 字节码中创建一个静态方法,但所做的只是检索伴随对象的实例并调用其上的方法,您可以通过反编译生成的字节码来验证。

【讨论】:

Proguard 是否删除未使用的实例化?

以上是关于如何在 Kotlin 中创建静态函数而不创建对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QML 中访问 C++ 类对象,而不是在 QML 中创建单独的对象?

如何在没有初始化和特定数量元素的情况下在 Kotlin 中创建对象数组?

js中创建对象方式----原型模式

如何仅通过提供大小来像在 Java 中一样在 Kotlin 中创建数组?

在测试中创建和导入辅助函数,而不使用 py.test 在测试目录中创建包

Python Django:在内存中创建文件对象而不实际创建文件