5

简短的问题

我可以将 Kotlin 对象INSTANCE(用于 Java 互操作)的可见性修改为internal或降低吗?

长问题

我正在编写一个库,并且我想要一个用 Kotlin 编写的 API 文件/类,它公开一个要从 Java 或 Kotlin 调用的函数,如下所示:

科特林:

API.function()

爪哇:

API.function();

我可以通过这样写来实现这一点:

科特林:

object API {
    @JvmStatic
    fun function() = TODO()
}

但是,现在我也可以这样做:

爪哇:

API.INSTANCE.function();

为了简单起见,我想阻止这种访问以INSTANCE将我的 API 表面保持在最低限度。

我可以修改INSTANCEtointernal或更低的可见性吗?

这可能是不可能的,因为对API(来自 Kotlin 的)的任何调用都会返回对象的实例,并且可能也应该隐藏它才能实现。但是,我很好奇它是否没有重大黑客攻击。

使用 Java 的解决方案是用 Java 编写API

public final class API {
    private API() {
    }

    public static void function() {
    }
}

但是,我正在寻找用 Kotlin 编写的解决方案。

4

1 回答 1

4

我能想到的最接近的是这样的:

API.kt在包中创建一个文件com.example.api。将您的函数直接添加到该文件中,如下所示:

@file:JvmName("API")

package com.example.api

fun function() {
    // ...
}

科特林:

您可以在需要使用 api 的任何地方导入该函数:

import com.example.api.function

虽然你不能再使用你的语法API.function了。

爪哇:

生成的类看起来像这样(没有单例,只有静态方法,但没有私有构造函数):

 public final class API {
     public static final void function() {
         // ...
     }
 }

然后允许您将其称为API.function();


通过指定@file:JvmName("API")您指示 kotlin 命名创建的类API

于 2019-05-21T12:04:44.493 回答