Kotlin で static なメンバーをどう書くべきなのか?

092: Learning Kotlin – dealing with static-ness and (companion) objects costs – Fragmented

「companion object」だな. と思いながらとりあえず書く.


class Foo {
    companion object {
        val myVar = "testing"
    }
}

これを Kotlin から呼ぶ場合は,


Foo.myVar

ですが, Java から呼ぶ場合は,


Foo.Companion.getMyVar();

となり クソですね.

では, Jvm アノテーション を使います.


class Foo {
    companion object {
        @JvmField val myVar = "testing"
    }
}

この場合は Kotlin/Java それぞれ同じように呼べます.


// calling from Kotlin
Foo.myVar

// calling from Java
Foo.myVar;

なるべく入れたくないですよね Jvm なアノテーション.

const キーワード を使う


class Foo {
    companion object {
        const val myVar = "testing"
    }
}

以下, 共に問題ありません.


// calling from Kotlin
Foo.myVar

// calling from Java
Foo.myVar;

同様に, パッケージレベルでは,


class BottomSheetView {
    companion object {
        const val BOTTOM_SHEET_ANIMATION_TIMING = 500L
    }

    // ...
}


animation.setTiming(BottomSheetView.BOTTOM_SHEET_ANIMATION_TIMING)

Companion object is initialized from the static constructor of the containing class and plain object is initialized lazily on the first access to that object.

こんなかんじでしっくりくる記述って見つけにくい気がしません? Kotlin て.

“Static constants” in Kotlin | Kotlin Blog


【Bluetooth】遠隔操作で写真が撮れる39円ボタン

こんなのあるんですね.



BTで端末とペアリングすれば

ボタンが2つだけの仮想キーボードとして稼働します.


override fun dispatchKeyEvent(event: KeyEvent?): Boolean {
  println("$event")
  return super.dispatchKeyEvent(event)
}


I/System.out: KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_VOLUME_UP, scanCode=115, metaState=0, flags=0x8, repeatCount=0, eventTime=205335386, downTime=205335386, deviceId=9, source=0x101 }
I/System.out: KeyEvent { action=ACTION_UP, keyCode=KEYCODE_VOLUME_UP, scanCode=115, metaState=0, flags=0x8, repeatCount=0, eventTime=205335591, downTime=205335386, deviceId=9, source=0x101 }

I/System.out: KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_ENTER, scanCode=28, metaState=0, flags=0x8, repeatCount=0, eventTime=205340874, downTime=205340874, deviceId=9, source=0x101 }
I/System.out: KeyEvent { action=ACTION_UP, keyCode=KEYCODE_ENTER, scanCode=28, metaState=0, flags=0x8, repeatCount=0, eventTime=205341051, downTime=205340874, deviceId=9, source=0x101 }

よって, 音量UPボタンとエンターボタンの2つの操作を数メートル離れたとこから操作できます.

一方, カメラアプリでは, 音量ボタンでシャッターを切ることができます.

そういうことで自撮りなどに楽しく利用できます.

ちなみに電池は「CR2032 3V」が入ってました.


10個 CR2032 ボタン電池 3v リチウムコイン電池

👉 Amazon Dash Button ってどうなってたっけ? hatena-bookmark


Convert Java File to Kotlin の後に その5 「String Templates」

面倒な文字列の連結.


private static final String SQL_CREATE_ENTRIES =
        "CREATE TABLE " + TasksPersistenceContract.TaskEntry.TABLE_NAME + " (" +
                TasksPersistenceContract.TaskEntry.COLUMN_NAME_ENTRY_ID + TEXT_TYPE + " PRIMARY KEY," +
                TasksPersistenceContract.TaskEntry.COLUMN_NAME_TITLE + TEXT_TYPE + COMMA_SEP +
                TasksPersistenceContract.TaskEntry.COLUMN_NAME_DESCRIPTION + TEXT_TYPE + COMMA_SEP +
                TasksPersistenceContract.TaskEntry.COLUMN_NAME_COMPLETED + BOOLEAN_TYPE +
        " )";

android-architecture/TasksDbHelper.java at todo-mvp · googlesamples/android-architecture

String Templates

「$」マークを使って簡潔に記述できます. ヒアドキュメントのような記述も可能です.

Basic Types - Kotlin Programming Language

これらを使うと上のJavaコードは以下のようになります.


private val SQL_CREATE_ENTRIES =
        """
        CREATE TABLE ${TasksPersistenceContract.TaskEntry.TABLE_NAME} (
            ${TasksPersistenceContract.TaskEntry._ID}$TEXT_TYPE PRIMARY KEY,
            ${TasksPersistenceContract.TaskEntry.COLUMN_NAME_ENTRY_ID}$TEXT_TYPE$COMMA_SEP
            ${TasksPersistenceContract.TaskEntry.COLUMN_NAME_TITLE}$TEXT_TYPE$COMMA_SEP
            ${TasksPersistenceContract.TaskEntry.COLUMN_NAME_DESCRIPTION}$TEXT_TYPE$COMMA_SEP
            ${TasksPersistenceContract.TaskEntry.COLUMN_NAME_COMPLETED}$BOOLEAN_TYPE )
        """

Convert Java File to Kotlin の後に その1「メンバとコンストラクタ」

Convert Java File to Kotlin の後に その2 「apply」

Convert Java File to Kotlin の後に その3 「Null Safety」

Convert Java File to Kotlin の後に その4 「lateinit」

Convert Java File to Kotlin の後に その5 「String Templates」