gpt4 book ai didi

java - 从 Java(和 Kotlin)隐藏 Kotlin 对象的实例字段

转载 作者:行者123 更新时间:2023-12-02 12:47:11 28 4
gpt4 key购买 nike

简短的问题

我可以修改 Kotlin 对象的可见性 INSTANCE (用于 Java 互操作)到 internal还是更低?

长问题

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

Kotlin :

API.function()

java :

API.function();

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

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

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

java :

API.INSTANCE.function();

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

我可以修改 INSTANCE 的可见性吗?至 internal还是更低?

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

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

public final class API {
private API() {
}

public static void function() {
}
}

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

最佳答案

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

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

@file:JvmName("API")

package com.example.api

fun function() {
// ...
}

Kotlin :

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

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

java :

生成的类看起来像这样(没有单例,只有静态方法,但没有私有(private)构造函数):
 public final class API {
public static final void function() {
// ...
}
}

然后允许您将其称为 API.function();
通过指定 @file:JvmName("API")您指示 kotlin 为创建的类命名 API .

关于java - 从 Java(和 Kotlin)隐藏 Kotlin 对象的实例字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56237695/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com