S-JIS[2011-07-12] 変更履歴

Scala DateUtilを作ってみる

Javajava.util.Datejava.sql.Dateに変換するユーティリティーを作ったことがあるが、Scalaだともっと便利に出来る。


Java:java.util.Dateをjava.sql.Dateに変換

Javaでjava.util.Dateをjava.sql.Dateに変換するライブラリーは、以下のような感じで作れる。

DateUtil.java:

package sample;

//単純名がかぶっているので、どちらかしかインポートできない
import java.util.Date;
//import java.sql.Date;
public class DateUtil {

	public static java.sql.Date toSqlDate(Date date) {
		return new java.sql.Date(date.getTime());
	}
}

インポートしたのはjava.util.Dateなので、java.sql.Dateは限定名(FQCN)で書かないといけない。


使う側の例
Javaソース 備考
import java.util.Date;

import sample.DateUtil;
Date udate = new Date();
java.sql.Date sdate = DateUtil.toSqlDate(udate);
 
import java.util.Date;

import static sample.DateUtil.*;
Date udate = new Date();
java.sql.Date sdate = toSqlDate(udate);
staticインポートを使用した例。

Scala:java.util.Dateをjava.sql.Dateに変換

Javaで作った変換ユーティリティーを、まずはそのままScalaに置き換えてみる。

DateUtil.scala:

package sample

//Scalaでは、インポート時に別名を付けることが出来る
import java.util.{ Date => UDate }
import java.sql.{  Date => SDate }
object DateUtil {

  def toSqlDate(date: UDate): SDate = {
    new SDate(date.getTime())
  }
}

Scalaにはstaticメソッドは存在しない。そのようなメソッドはobjectの中に定義することで、似た使い方が出来る。

ソースの改善
Scalaソース 備考
def toSqlDate(date: UDate): SDate = {
  new SDate(date.getTime())
}
基本形。
Scalaではreturnは省略する。
def toSqlDate(date: UDate) = {
  new SDate(date.getTime())
}
Scalaではブロック「{〜}」内の一番最後の式の結果がメソッドの戻り値になる。
この為、メソッドの戻り値の型とその式の型が一致している場合は
戻り値の型の宣言を省略できる。
def toSqlDate(date: UDate) =
  new SDate(date.getTime())
ブロック「{〜}」内に式が1つしか無い場合、ブロックである必要は無い。
波括弧を省略できる。

使う側の例
Scalaソース 備考
import java.util.{ Date => UDate }

import sample.DateUtil
val udate = new UDate
val sdate = DateUtil.toSqlDate(udate)
Scalaでは、valで変数を宣言する。
変数の型は、「=」の右辺の型になる。
(変数の型を明示的に書く必要は無い)
import java.util.{ Date => UDate }

import sample.DateUtil._
val udate = new UDate
val sdate = toSqlDate(udate)
メソッドをインポートした例。

Scala:java.util.DateにtoSqlDateメソッドを追加

Scalaでは、自分で修正することのできない既存クラス後からメソッドを追加する(ように見せる)ことが出来る。
(このような方式を「pimp my library」パターンと呼ぶ)

使う側の例:

import java.util.{ Date => UDate }

import sample.DateUtil2._
val udate = new UDate
val sdate = udate.toSqlDate 	//java.util.DateのtoSqlDateメソッドを呼んでいるような形

DateUtil2.scala:

package sample

object DateUtil2 {

  //Scalaでは、ソースファイルの先頭以外の場所でもインポートを書くことが出来る
  import java.util.{ Date => UDate }
  import java.sql.{  Date => SDate }

  implicit def udate4DateUtil(date: UDate) = new {
    def toSqlDate = new SDate(date.getTime())
  }
}

Scala実験へ戻る / Scala目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま