Можно ли пометить метод как устаревший для вызывающих абонентов Kotlin, но не для вызывающих элементов Java? - PullRequest
0 голосов
/ 31 октября 2018

Я хочу расширить API таким образом, чтобы это было полезно для вызывающих Kotlin, но не для Java-вызывающих. Поэтому я хотел бы призвать пользователей Kotlin перейти на новый метод, не беспокоя пользователей Java. У нас есть большая кодовая база, представляющая собой смесь Java и Kotlin, и в ближайшее время она не будет на 100% Kotlin.

Есть ли способ добавить тег @Deprecate или аналогичный, который отображается только в Kotlin, а не в Java?

Если вас интересуют конкретные детали, у нас есть интерфейс Log, который принимает отформатированную строку, что-то вроде этого:

Log.get().info("Log message with some $expensive $things to $format")

Эта строка создается при каждом вызове, даже если ведение журнала отключено. Исправление API регистратора для разделения строки формата и аргументов по отдельности было бы большим и разрушительным изменением. Однако обнуляемые типы Kotlin могут дать нам очень дешевое решение:

Log.getNullable()?.info("This $expensive $format should be skipped if there's no logger")

Просто случай замены get(). на getNullable()?. во всем коде Kotlin. Но я бы не хотел использовать getNullable() в коде Java, потому что есть риск NullPointerException. Поэтому старый метод Log.get в идеале не рекомендуется использовать в Kotlin, а не в Java.

1 Ответ

0 голосов
/ 31 октября 2018

Предполагается, что класс Log, чьи методы определены в companion object, например ::

class Log {
  companion object {
    @JvmStatic
    fun get() : String = TODO()
    @JvmStatic
    fun getNullable() : String? = TODO()
  }
}

Как насчет простого удаления @JvmStatic? или вместо этого создаете функцию расширения?

fun Log.Companion.getNullable() : String? = TODO()
class Log {
  companion object {
    @JvmStatic
    fun get() : String = TODO()
  }
}

Функции расширения обычно не так легко доступны в Java, как в Kotlin. Для удаления @JvmStatic или функции расширения в коде Java потребовалось бы следующее: Log.Companion.getNullable вместо Log.getNullable ... Возможно, это также подходит для вас вместо того, чтобы осудить его.

Даже если мое предположение неверно, функция расширения может удовлетворить ваши потребности.

Что касается устаревшего метода только для Kotlin ... Я не думаю, что это работает, но вот еще один обходной путь для этого. Просто переименуйте метод и используйте @JvmName("get") для метода, например ::

@JvmStatic
@JvmName("get")
fun dont_ever_use_this_method_again_in_Kotlin() : String = TODO()

Это позволит Log.get с Java, но не с Kotlin. И я думаю, мы можем согласиться с тем, что никто не позвонит Log.dont_ever_use_this_method_again_in_Kotlin в Котлин, верно?

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