在Java(和Kotlin)中隐藏Kotlin对象的INSTANCE字段

6

简短问题

我能否将 Kotlin 对象的 INSTANCE(用于 Java 交互)的可见性修改为 internal 或更低级别?

长问题

我正在编写一个库,我想要有一个 API 文件/类,使用 Kotlin 编写,它可以公开一个函数供 Java 或 Kotlin 调用,如下所示:

Kotlin:

API.function()

Java:

API.function();

我可以通过以下方式来实现这个功能:
Kotlin:
object API {
    @JvmStatic
    fun function() = TODO()
}

然而,现在我也可以做到这一点:
Java:
API.INSTANCE.function();

为了简化API表面,我希望阻止对INSTANCE的访问。

我能否将INSTANCE的可见性修改为internal或更低?

这可能不太可能,因为任何从Kotlin调用API都会返回对象的实例,这也应该被隐藏,以使得这种修改成为可能。然而,我很好奇是否有一些不需要大规模改动的方法可以实现。

使用Java编写API的解决方案是一种选择:

public final class API {
    private API() {
    }

    public static void function() {
    }
}

然而,我正在寻找一种用Kotlin编写的解决方案。


你有没有考虑用Java编写接口,然后用Kotlin实现呢? - uaraven
我认为你一开始并不想要一个object(~单例)(也许你考虑的是一个Utilitity类,因为这是在Java中支持此类函数的唯一方式?;-)),而是想要通过一个共同的接口访问一组函数...Linos的答案向您展示了这一点,并且它将被包装成您在Java方面感到舒适的方式... - Roland
1个回答

5
我能提供的最接近的翻译如下:

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

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

@file:JvmName("API")

package com.example.api

fun function() {
    // ...
}

Kotlin:

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

import com.example.api.function

虽然您不能再使用语法API.function

Java:

生成的类将类似于这样(没有单例,只有静态方法,但没有私有构造函数):

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

这样就可以像这样调用它:API.function();


通过指定@file:JvmName("API"),你可以让kotlin将创建的类命名为API


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接