Каков наилучший способ определения константы log TAG в Kotlin?

Я создаю свои первые классы Kotlin в своем приложении для Android. Обычно для ведения журнала я имею константу с именем TAG . Что я буду делать на Java:

 private static final String TAG = MyClass.class.getSimpleName(); 

Я знаю, что в классах Котлин я могу создать TAG следующим образом:

 private val TAG = MyClass::class.java.simpleName 

Это нормально для проектов, которые используют Java и Kotlin, но что, если я начну новый проект только в Котлине? Как определить константу TAG ? Есть ли еще способ Котлин, где у меня нет этой странной конструкции class.java.simpleName ?

В общем случае константы – это все шапки (например, FOO) и расположены в сопутствующем объекте :

 class MyClass { companion object { public const val FOO = 1 } } 

и для определения поля TAG вы можете использовать:

 private val TAG = MyClass::class.qualifiedName 

Я создаю константу как объект-компаньон:

 companion object { val TAG = "SOME_TAG_VALUE" } 

Тогда я могу использовать его так:

 MyClass.TAG 

Я нашел способ, который является более «copy-paste» -able, поскольку он не требует ввода имени вашего класса:

 package com.stackoverflow.mypackage class MyClass { companion object { val TAG = this::class.toString().split(".").last().dropLast(10) } } 

Это не самое элегантное решение, но оно работает.

this::class.toString().split(".").last() предоставит вам "com.stackoverflow.mypackage.MyClass$Companion" поэтому вам нужно dropLast(10) чтобы удалить $Companion .

В качестве альтернативы вы можете сделать это:

 package com.stackoverflow.mypackage class MyClass { val TAG = this::class.simpleName } 

Но тогда переменная-член TAG больше не является «статической» и не соответствует рекомендуемым соглашениям об именах.

AnkoLogger использует интерфейс для определения тега журнала.

 interface AnkoLogger { /** * The logger tag used in extension functions for the [AnkoLogger]. * Note that the tag length should not be more than 23 symbols. */ val loggerTag: String get() = getTag(javaClass) } private fun getTag(clazz: Class<*>): String { val tag = clazz.simpleName return if (tag.length <= 23) { tag } else { tag.substring(0, 23) } } inline fun AnkoLogger.info(message: () -> Any?) { val tag = loggerTag if (Log.isLoggable(tag, Log.INFO)) { Log.i(tag, message()?.toString() ?: "null") } } 

Вы можете использовать его следующим образом:

 class MyClass : AnkoLogger { fun someFun(){ info("logging info") } } 

Возможно, AnkoLogger может дать вам некоторые идеи по внедрению специального инструмента ведения журнала.

Объявить переменную TAG с val

 class YourClass { companion object { //if use java and kotlin both in project //private val TAG = MyClass::class.java.simpleName //if use only kotlin in project private val TAG = YourClass::class.simpleName } } 

Используйте переменную типа

 Log.d(YourClass.TAG, "Your message"); //or Log.e(TAG, "Your message"); 
  • Является ли тип неявного свойства одинаковым с явным типом свойства?
  • Глобальная функция расширения в котлине
  • Использовать статический метод в Java как метод расширения в Котлине
  • как сделать множество подмножеств постоянными в котлине
  • Kotlin Dokka - Не удается найти задачу Dokka в андроид-студии
  • Как получить доступ к членам класса с таким же именем в функции расширения в Kotlin android
  • Kotlin - Почему эта функция не подходит для рекурсии хвоста?
  • Почему Netbeans жалуется на двусмысленность, в то время как Intellij вместо этого не
  • Почему строка интерполяции Kotlin объединяет строки в Java?
  • Как передать контекст Неявно для конструкторов в Котлине
  • Когда именно ключевое слово оператора требуется в Котлине?
  • Давайте будем гением компьютера.