アンセケターメンはてなエディション

いつどこで誰に見られても恥ずかしいコードが置かれています

Kotlinでもnameof演算子を使いたい!

C#にはnameof演算子というものがあり、変数名を文字列リテラルにして埋め込んでくれる(主にデバッグとINotifyPropertyChanged向けの)便利機能があります。

Kotlinにはないらしいので頑張ってそれっぽいのを錬成(海外フォーラム丸パクリともいう)してみました。

ソースはこれです。

Nameof to get names of program elements - Language Design - Kotlin Discussions

Given that IntelliJ IDEA’s refactorings do a fairly good job

I disagree. String literal search may find many unrelated usages especially for common identifier names, so it couldn’t be trusted really.

この流れすき。

結論

  • ローカル変数や、クラス内部から見たインスタンス変数は::変数名.nameで取得
  • クラス外部から見たインスタンス変数はクラス名::変数名.nameで取得

コード例

class Fuga(val foo: Int){
    val bar: Int
        get() = foo * 2
    fun fooTimes(multiplier: Int) = foo * multiplier
    fun printMembers(){
        //クラスの中からメンバを呼ぶときはこっち
        println(::bar.name) // -> bar
        println(::fooTimes.name) // -> fooTimes
    }
}
//↑こういう感じの定義があるとする

fun main() {
    val hoge = 3
    //ローカル変数
    println(::hoge.name) // -> hoge
    
    val fuga=Fuga(5)
    
    //クラス名
    println(Fuga::class.java.name) // -> Fuga
    //クラスの関数名
    println(Fuga::fooTimes.name) // -> fooTimes
    //クラスのフィールド名
    println(Fuga::foo.name) // -> foo
    println(Fuga::bar.name) // -> bar
    
    fuga.printMembers()
}