【问题标题】:Static const in Kotlin from Java class name来自 Java 类名的 Kotlin 中的静态 const
【发布时间】:2016-05-12 09:34:16
【问题描述】:

我通常在 Java 中有这个:

package some.package;
public class Clz {
    public static final String ACTION_DIVE = Clz.class.getName() + ".action.DIVE";
}

可从该类外部以Clz.ACTION_DIVE 访问,其值为"some.package.Clz.action.DIVE"

如何在 Kotlin 类 Clz 中执行相同的操作,以便可以从外部 Java 类以相同的方式访问它?我尝试了以下方法,但它没有编译,因为它不是常量:

package some.package
object Clz {
    const val ACTION_DIVE = Clz.javaClass.name + ".action.DIVE"
}

【问题讨论】:

    标签: java constants kotlin


    【解决方案1】:

    Clz::class.java.name

    请参阅 Kotlin 官方文档中的 Class references

    【讨论】:

    • 不起作用。 const val ACTION_DIVE = Clz::class.java.name + ".action.DIVE" 错误是:Const val initializer should be a constant value
    • 使用@JvmField 代替constconst 仅用于编译时常量):kotlinlang.org/docs/reference/…
    • 我想就是这样。 @JvmField。谢谢!
    • 该问题要求从类名中获取静态常量,并且在第一条评论之后,这并没有解决它-
    【解决方案2】:

    你可以使用:

    object Clz {
        val ACTION_DIVE = Clz::class.java.name + ".action.DIVE"
    }
    

    请注意,由于它调用的是java 扩展属性,所以ACTION_DIVE 可能不是const

    如果你真的需要一个 const 你可以这样做 你可以在旧版本的 Kotlin 编译器中这样做

    object Clz {
        const val ACTION_DIVE = "" + Clz::class + ".action.DIVE"
    }
    

    【讨论】:

    • 它似乎不适用于 const :const val ACTION_DIVE = "" + Clz::class + ".action.DIVE"
    • @StephaneL 我猜它曾经在旧版本的 Kotlin 编译器中工作。不过,这可能是一个错误。
    【解决方案3】:

    你可以在你的类中声明一个companion object 并将常量属性放在里面。

    class Clz {
    
        companion object{
             var ACTION_DIVE = Clz::class.simpleName + ".action.DIVE"
        }
    }
    

    然后你就可以访问该属性了

    println(Clz.ACTION_DIVE)
    

    【讨论】:

    • 全局可变变量很少是个好主意。也不是作者的本意。
    【解决方案4】:

    一种连接字符串的优雅方式:

    package some.package
    
    object Clz {
        val ACTION_DIVE = "${Clz::class.java.name}.action.DIVE"
    }
    

    【讨论】:

    • 这不会编译:“Const 'val' 初始化器应该是一个常量值”
    • @miensol 你是对的,我刚刚删除了const 修饰符。
    【解决方案5】:

    为我工作:

    class FetchWeatherTask : AsyncTask<Void,Void,String>() {
        companion object {
            @JvmField val TAG: String = FetchWeatherTask().javaClass.simpleName
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多