Kotlin 如何访问引用文件的顶级函数';重新申报?
如果您在app/utils/中有一个文件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()
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)
}