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はいいですね。