今回は、AOPをScalaでやるには?ってテーマです。JavaだとAOPのライブラリを使って黒魔術的にごにょるワケですが、Scalaの場合はトレイトを使ったミックスインで実現できます。
trait Login { def login(userName:String,password:String) } trait LoggableLogin extends Login { abstract override def login(userName:String,password:String) = { println("logging start") super.login(userName,password) println("logging end") } } class DefaultLogin extends Login { def login(userName:String, password:String) = println("u = %s, p = %s".format(userName, password)) }
クライアント側のコードはこちら。
val login = new DefaultLogin with LoggableLogin // mixinする login.login("hoge","fuga")
実行結果はこちら。
logging start u = hoge, p = fuga logging end
トレイトの特性を活かして実装するので、Javaでやる場合より完結でわかりやすいですね。