かとじゅんの技術日誌

技術の話をするところ

ScalaにAOPをやらせてみる

今回は、AOPScalaでやるには?ってテーマです。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でやる場合より完結でわかりやすいですね。