Mar*_*lev 56 java android constants kotlin
我正在Android应用程序中创建我的第一个Kotlin类.通常为了记录目的,我有一个名字常量TAG.我在Java中会做的是:
private static final String TAG = MyClass.class.getSimpleName();
Run Code Online (Sandbox Code Playgroud)
我知道在Kotlin课程中我可以TAG用这种方式创建:
private val TAG = MyClass::class.java.simpleName
Run Code Online (Sandbox Code Playgroud)
对于使用Java和Kotlin的项目来说这是可以的,但是如果我开始一个仅在Kotlin中的新项目呢?我如何定义那里TAG不变?还有更多的Kotlin方式我没有这种奇怪的结构class.java.simpleName吗?
Gab*_*tti 35
通常,常量都是大写字母(例如FOO)并位于伴随对象中:
class MyClass {
companion object {
public const val FOO = 1
}
}
Run Code Online (Sandbox Code Playgroud)
并定义您可以使用的TAG字段:
private val TAG = MyClass::class.qualifiedName
Run Code Online (Sandbox Code Playgroud)
Fre*_*ros 34
此扩展允许我们在任何类中使用TAG
val Any.TAG: String
get() {
val tag = javaClass.simpleName
return if (tag.length <= 23) tag else tag.substring(0, 23)
}
//usage
Log.e(TAG,"some value")
Run Code Online (Sandbox Code Playgroud)
它还被验证为作为Android有效的日志标记.
Rah*_*ari 14
我喜欢TAG成为Fredy Mederos 建议的扩展功能。
扩展他的答案以支持匿名类:
/**
* extension function to provide TAG value
*/
val Any.TAG: String
get() {
return if (!javaClass.isAnonymousClass) {
val name = javaClass.simpleName
if (name.length <= 23) name else name.substring(0, 23)// first 23 chars
} else {
val name = javaClass.name
if (name.length <= 23) name else name.substring(name.length - 23, name.length)// last 23 chars
}
}
Run Code Online (Sandbox Code Playgroud)
use*_*708 11
在Kotlin中,您可以创建一个扩展,并将标记作为方法调用.这意味着你永远不必在每个类中定义它,我们可以在每次调用方法时动态构造它:
inline fun <reified T> T.TAG(): String = T::class.java.simpleName
Run Code Online (Sandbox Code Playgroud)
Yar*_*lyk 10
通常建议的使用companion objectgenerate的方法会生成static final伴随类的额外实例,因此性能和内存都很差。
将日志标记定义为顶级常量,因此仅生成额外的类(MyClassKt),但companion object与之相比,将没有该类的static final实例(也没有任何实例):
private const val TAG = "MyLogTag"
class MyClass {
fun logMe() {
Log.w(TAG, "Message")
}
}
Run Code Online (Sandbox Code Playgroud)
使用正常val。尽管看到日志标记不是全大写的常量看起来很不寻常,但这不会生成任何类并且开销最少。
class MyClass {
private val tag = "myLogTag"
fun logMe() {
Log.w(tag, "Message")
}
}
Run Code Online (Sandbox Code Playgroud)
简单地做以下工作对我有用.
private val TAG = this::class.java.simpleName
Run Code Online (Sandbox Code Playgroud)
最好的登录方式(恕我直言)是使用 Timber:https : //github.com/JakeWharton/timber
但是如果你不想使用图书馆,那么
TAG 可以定义为内联扩展属性(例如 in Extensions.kt):
inline val <reified T> T.TAG: String
get() = T::class.java.simpleName
Run Code Online (Sandbox Code Playgroud)
一些更多的扩展,不要一直写 TAG Log.d(TAG, ""):
inline fun <reified T> T.logv(message: String) = Log.v(TAG, message)
inline fun <reified T> T.logi(message: String) = Log.i(TAG, message)
inline fun <reified T> T.logw(message: String) = Log.w(TAG, message)
inline fun <reified T> T.logd(message: String) = Log.d(TAG, message)
inline fun <reified T> T.loge(message: String) = Log.e(TAG, message)
Run Code Online (Sandbox Code Playgroud)
然后你可以在任何类中使用它们:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
logd("Activity created")
}
Run Code Online (Sandbox Code Playgroud)
您可以TAG通过@JvmField以下方式定义您的:
companion object {
@JvmField val TAG: String = MyClass::class.java.simpleName
}
Run Code Online (Sandbox Code Playgroud)
有关更多详细信息,您可以阅读本文:Kotlin的隐藏成本
| 归档时间: |
|
| 查看次数: |
16426 次 |
| 最近记录: |