今回は、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でやる場合より完結でわかりやすいですね。