Как скрыть видимость внутреннего класса 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() {
}
}