Можно ли предоставить пользовательское имя для внутренних делегированных свойств в Kotlin? - PullRequest
3 голосов
/ 22 октября 2019

У меня есть следующий фрагмент кода, и я хочу получить доступ к свойству scriptDsl из Java из той же кодовой базы. Я не хочу показывать scriptDsl публично.

class ScriptDsl {
    internal val scriptDsl: JScriptDsl by lazy { //... }
}

при компиляции, scriptDsl становится public final JScriptDsl getScriptDsl$esw_ocs_dsl_kt(), но я хочу указать здесь произвольное имя, которое возможно для не делегированных свойств, используя JvmName("scriptDsl"). Как это сделать для internal delegated properties?

У меня все хорошо, если есть какие-то другие лучшие решения, мои требования: «

  • Я хочу позвонить scriptDsl из Явы в пределахтот же модуль
  • Я вызываю его с помощью отражения, поэтому необходимо заранее знать имя
  • ScriptDsl общедоступно, и я не хочу, чтобы свойство scriptDsl было доступно вне модуля
  • scriptDsl должно быть ленивым, потому что это зависит от других свойств, которые могут быть недоступны при объявлении

Примечание: я знаю, internal в kotlin это public в java.

Из документации kotlin:

внутренние объявления становятся открытыми в Java. Члены внутренних классов проходят через искажение имен, чтобы затруднить их случайное использование из Java иразрешить перегрузку для членов с одинаковой подписью, которые не видят друг друга в соответствии с правилами Kotlin;

1 Ответ

6 голосов
/ 22 октября 2019

Вы можете указать свою цель аннотации для получателя следующим образом:

class ScriptDsl {
    @get:JvmName("scriptDsl")
    internal val scriptDsl: JScriptDsl by lazy { //... }
}

, а затем просто вызвать ее с помощью scriptDsl:

ScriptDsl scriptDsl = new ScriptDsl();
scriptDsl.scriptDsl();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...