在Kotlin中定义log TAG常量的最佳方法是什么?

我在我的Android应用程序中创建了我的第一个Kotlin类。 通常为了记录的目的,我有一个名字为TAG的常量。 我会在Java中做什么是:

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

我知道在Kotlin类中我可以用这种方式创建TAG

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

这对于使用Java和Kotlin的项目来说是可以的,但是如果我开始一个仅在Kotlin中的新项目呢? 我怎样才能定义TAG常量? 有没有更多的KOTLIN方式,我没有这个奇怪的建设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 

我发现了一种更“复制粘贴”的方式,因为它不需要你键入你的类的名字:

 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成员variables不再是“静态的”,并且不遵循推荐的命名约定。

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可以给你一些实现自定义日志记录工具的想法。

val声明TAGvariables

 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 } } 

使用像这样的variables

 Log.d(YourClass.TAG, "Your message"); //or Log.e(TAG, "Your message"); 

使用Jpihl的答案的想法,我创建了日志标记的扩展字段。

这是失败:

 val KClass.logTag: String get() { val tagWithSuffix = this.toString().split(".").last() val companionIndex = tagWithSuffix.indexOf("\$Companion") return if (companionIndex >= 0) { // Removes companion suffix and everything after it tagWithSuffix.removeRange(companionIndex, tagWithSuffix.length) } else { // The tag is not created in companion object tagWithSuffix } } 

现在当我需要在某个类中创建TAG常量时,我​​这样做:

 companion object { private val TAG = this::class.logTag } 

好的是,你可以复制粘贴,这将适用于每个类。

你可以通过@JvmField来定义你的TAG ,如下所示:

 companion object { @JvmField val TAG: String = MyClass::class.java.simpleName } 

欲了解更多详情,可以阅读这篇文章: Kotlin的隐藏成本

Kotlin 1.2.20更新了答案

 class MyClass { companion object { @JvmField public val FOO = 1 } } 

使用

 MyClass.FOO