Как скрыть видимость внутреннего класса Kotlin в Java из разных модулей?

Я работал над библиотекой Android, которую разрабатываю в Котлине. Я сохранил модификатор доступа к некоторым классам какinternal. Внутренние классы видны только в этом библиотечном модуле в Kotlin. Если я реализую эту библиотеку в приложении, она вообще не будет видна.

Но проблема возникает при доступе к этой библиотеке из кода Java. Если я создам.java файл и введите имя этого internal класс библиотеки, тогда IDE предлагает имя, и оно разрешается и компилируется без каких-либо ошибок.

Например,

Библиотечный модуль:

internal class LibClass {
    // Fields and Methods
}

После реализации указанной выше библиотеки в модуле DemoApp:

Модуль приложения

Котлин:
fun stuff() {
    val lib = LibClass() // Error.. Not resolving
}
Ява:
public void stuff() {
    LibClass lib = new LibClass() // Successfully resolving and compiling
}

Так вот в чем проблема. Как я могу добиться защиты этого класса от Java?

Спасибо!

3 ответа

Решение

Не идеальное решение, но я нашел два хакерских решения

Аннотируйте каждый публичный метод этого internal class от @JvmName с пробелами или специальными символами, с помощью которых он будет генерировать синтаксическую ошибку в Java.

Например,

internal class LibClass {

    @JvmName(" ") // Blank Space will generate error in Java
    fun foo() {}

    @JvmName(" $#") // These characters will cause error in Java
    fun bar() {}
}

Поскольку это решение, приведенное выше, не подходит для управления огромным проектом или не кажется хорошей практикой, приведенное ниже решение может помочь.

Аннотируйте каждый публичный метод этого internal class от @JvmSynthetic по которым общедоступные методы недоступны для Java.

Например,

internal class LibClass {

    @JvmSynthetic
    fun foo() {}

    @JvmSynthetic
    fun bar() {}
}

Заметка:

Это решение защищает методы / поля функции. Согласно вопросу, он не скрывает видимость класса в Java. Так что идеальное решение этой проблемы все еще ожидается.

Я вижу, у вас есть класс с внутренним модификатором, который не может быть создан в классе kotlin, но может быть создан в файле Java. Если это автономный класс, вы можете сделать его конструктор закрытым и разрешить создание экземпляра с помощью статического метода (объект Companion).

Если вы хотите скрыть видимость класса вместо каждой функции или поля, вы можете использовать @file:JvmSynthetic на вершине вашего класса.

Например

      @file:JvmSynthetic
package  com.example.app

internal class LibClass {
    var count: Int = 0

    internal fun exampleFun() {
        
    }
}
Другие вопросы по тегам