在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