如何访问引用了声明它们的文件的顶级函数?

时间:2019-03-16 18:00:23

标签: kotlin

如果app / utils /中有文件MyUtils.kt

package app.utils

fun log(message: String) {
    println(message)
}

您要从app /的另一个文件log()访问此App.kt函数,您将执行以下操作:

package app

import app.utils.log

fun main() {
   log("hey")
}

但是我不喜欢如何从/ utils包而不是从log()文件中显式导入MyUtils.kt函数。 一种选择是用MyUtils.kt声明package app.utils.MyUtils,但我认为在没有匹配文件夹的包中声明文件不是一个好习惯。

有没有办法解决这个问题?

编辑:由于内存问题,声明objectclass都不是一个好的解决方案。

1 个答案:

答案 0 :(得分:1)

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,如果您不相信我,请执行Show Kotlin bytecode

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

Kotlin中的软件包通常被安排为符合它们所在的目录...但是,这并不是强制性的。您可以在同一目录下的多个包中编写类。这意味着文件名甚至目录名都不会真正影响Kotlin运行时类型和导入。

如果您担心无法快速找出函数的声明位置,建议您使用Java约定,通过其中的类名称来调用文件,然后将所有函数包装到object(与此相关的运行时成本绝对没有)。

package app.utils

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

文件:app / utils / MyUtils.kt

但是请注意,在任何像样的IDE中,导航到函数的声明都是微不足道的(通常是IntelliJ中的Meta + B),无论它位于哪个文件中,因此在使用时,通常不会出现此问题。一个IDE。