KotlinのTraitでクラスに依存した実装を行う。

AndroidのLogとかToastとかよく使うから短縮用のメソッドとかをActivityを継承したBaseActivityを作るのがバッドノウハウとか、ようてんさんが言ってたので、じゃあKotlinのtraitでやってみりゃいいんじゃねーの?と思ったのでやってみた。

まずはLogTraitを実装してみる。

package com.example.kotlin_trait
import android.util.Log

public trait LogTrait {
    fun e(tag: String, msg: String, e: Exception? = null) {
        if (e != null) {
            Log.e(tag, msg, e)
        } else {
            Log.e(tag, msg)
        }
    }

    fun i(tag: String, msg: String, e: Exception? = null) {
        if (e != null) {
            Log.i(tag, msg, e)
        } else {
            Log.i(tag, msg)
        }
    }

    fun v(tag: String, msg: String, e: Exception? = null) {
        if (e != null) {
            Log.v(tag, msg, e)
        } else {
            Log.v(tag, msg)
        }
    }

    fun d(tag: String, msg: String, e: Exception? = null) {
        if (e != null) {
            Log.d(tag, msg, e)
        } else {
            Log.d(tag, msg)
        }
    }

    fun w(tag: String, msg: String, e: Exception? = null) {
        if (e != null) {
            Log.w(tag, msg, e)
        } else {
            Log.w(tag, msg)
        }
    }
}

まぁここまでは普通のTraitですよねー。

次に、ToastTraitを実装してみる。
ToastTraitは、Toastを呼び出すのですが、ToastはContextを渡さないといけないんだけど、
それどーするの?というところで悩んでたんだけど、TraitにContextを継承させればいいようだ。
Traitでクラスを継承とかできるんすねー。知らんかった。

package com.example.kotlin_trait

import android.widget.Toast
import android.content.Context

public trait ToastTrait : Context {
    fun shortToast(resId : Int) {
        Toast.makeText(this, resId, Toast.LENGTH_SHORT)!!.show()
    }

    fun shortToast(str : String) {
        Toast.makeText(this, str, Toast.LENGTH_SHORT)!!.show()
    }

    fun longToast(resId : Int) {
        Toast.makeText(this, resId, Toast.LENGTH_LONG)!!.show()
    }

    fun longToast(str : String) {
        Toast.makeText(this, str, Toast.LENGTH_LONG)!!.show()
    }
}

こうすると、Traitの中のthisは継承したクラス自身になるので、
this=Contextオブジェクトになります。

これらをActivity側で継承する。

package com.example.kotlin_trait

import android.app.Activity
import android.os.Bundle

class MyActivity() : Activity(), LogTrait, ToastTrait {
    val TAG = getClass().getSimpleName()

    public override fun onCreate(savedInstanceState : Bundle?) {
        super<Activity>.onCreate(savedInstanceState)
        setContentView(R.layout.main)
        v(TAG, "v")
        d(TAG, "d")
        i(TAG, "i")
        w(TAG, "w")
        e(TAG, "e")
        shortToast("トースト食べたい。")
    }
}

ログは出せたし、Toastも出せた。これで勝つる。
やっぱりKotlinはいいですね。


タグ Android, Kotlin | パーマリンク.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です