Скрытие поля INSTANCE объекта Kotlin от Java (и Kotlin)

Короткий вопрос

Могу ли я изменить видимость объекта Kotlin INSTANCE (для взаимодействия с Java) internal или ниже?

Длинный вопрос

Я пишу библиотеку и хочу иметь API-файл / класс, написанный на Kotlin, который предоставляет функцию для вызова из Java или Kotlin следующим образом:

Котлин:

API.function()

Джава:

API.function();

Я могу добиться этого, написав это так:

Котлин:

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

Тем не менее, теперь я также могу сделать это:

Джава:

API.INSTANCE.function();

Я хочу предотвратить этот доступ к INSTANCE чтобы свести мою поверхность API к минимуму для простоты.

Могу ли я изменить видимость INSTANCE в internal или ниже?

Это, вероятно, не возможно, потому что любой вызов API (из Kotlin) возвращает экземпляр объекта, который, вероятно, должен быть скрыт, чтобы это было возможно. Тем не менее, мне любопытно посмотреть, если это без серьезных взломов.

Решение с использованием Java было бы написать API в Java:

public final class API {
    private API() {
    }

    public static void function() {
    }
}

Тем не менее, я ищу решение, написанное на Kotlin.

1 ответ

Самым близким, что я мог придумать, было что-то вроде этого:

Создать файл 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") вы поручаете котлину назвать созданный класс API,

Другие вопросы по тегам