Kotlin 如何访问引用文件的顶级函数';重新申报?

Kotlin 如何访问引用文件的顶级函数';重新申报?,kotlin,Kotlin,如果您在app/utils/中有一个文件MyUtils.kt: package app.utils fun log(message: String) { println(message) } 如果您想从App/的另一个文件App.kt访问此log()函数,您将执行以下操作: package app import app.utils.log fun main() { log("hey") } 但是我不喜欢如何从/utils包而不是从MyUtils.kt文件显式导入log()

如果您在app/utils/中有一个文件
MyUtils.kt

package app.utils

fun log(message: String) {
    println(message)
}
如果您想从App/的另一个文件
App.kt
访问此
log()
函数,您将执行以下操作:

package app

import app.utils.log

fun main() {
   log("hey")
}
但是我不喜欢如何从/utils包而不是从
MyUtils.kt
文件显式导入
log()
函数。 另一种方法是使用
package app.utils.MyUtils
声明
MyUtils.kt
,但我认为在没有匹配文件夹的包中声明文件不是一种好的做法

有办法解决这个问题吗

编辑:声明
对象
也不是一个好的解决方案,因为内存问题。

TL;DR

你不能

长答案

您似乎有一种误解,认为类或对象以某种方式给应用程序增加了一些内存问题

事实并非如此

事实上,如果您在JVM上运行,日志函数将编译为以下内容:

public final class UtilsKt {
    public static final void log(@NotNull String message) {
        Intrinsics.checkParameterIsNotNull(message, "message");
        System.out.println(message);
    }
}
你可以在IntelliJ上点击
Meta+Shift+A
,如果你不相信我的话,就显示Kotlin字节码

此外,您似乎认为应该可以在Kotlin导入中显式引用文件名。没有办法做到这一点。文件与Kotlin编译的代码几乎没有任何关系(文件名实际上反映在生成的Java类名上是一种意外,如上所示)

Kotlin中的包通常按照它们所在的目录进行排列。。。但顺便说一句,这不是强制性的。您可以在同一目录下的多个包中编写类。这意味着文件名甚至目录名实际上并不影响Kotlin运行时类型和导入

如果您担心无法快速找到函数的声明位置,我建议您使用Java约定,即根据存在于其中的类的名称调用文件,然后将所有函数包装到一个
对象中(

文件:app/utils/MyUtils.kt


但是请注意,对于任何一个像样的IDE,导航到函数声明都是微不足道的(通常是IntelliJ中的Meta+B),而不管它在哪个文件中,所以在使用IDE时,这个问题通常不是一个问题。

声明一个对象或类也不是一个好的解决方案,因为内存问题。:什么内存问题?无论如何,顶级函数就是这样工作的,接受它就行了。顶级类,并从包中导入。顶级函数也是如此。更不用说字节码中没有顶级函数,所以不管你是在JVM上运行,你的函数都会有一个包装类。这就是它的结构。从技术上讲,它是在
MyUtilsKt.java
中编译的,但Kotlin只是将其作为package@JBNizet如果我把它放在一个
类中
,那么我必须在我想使用我的函数的任何地方启动它,如果我把它放在一个
对象中
,如果我没有使用任何合适的依赖注入系统,那么一旦我需要传递对其中函数的大量引用,我就会遇到问题。对象是单例的。我不明白你的意思,也不明白为什么需要使用DI系统来使用对象中定义的函数。但是,正如我所说,您不应该为从包中导入顶级功能而烦恼。非常感谢您的回答。出于某种原因,我确信Singleton中的函数会保留一个对传递给它们的参数的引用,而现在考虑这些参数并没有多大意义,无论如何,感谢您澄清了这一点。
package app.utils

object MyUtils {
    fun log(message:String) => println(message)
}