S-JIS[2011-07-12] 変更履歴
Javaでjava.util.Dateをjava.sql.Dateに変換するユーティリティーを作ったことがあるが、Scalaだともっと便利に出来る。
Javaでjava.util.Dateをjava.sql.Dateに変換するライブラリーは、以下のような感じで作れる。
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インポートを使用した例。 |
Javaで作った変換ユーティリティーを、まずはそのまま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では、自分で修正することのできない既存クラスに後からメソッドを追加する(ように見せる)ことが出来る。
(このような方式を「pimp my library」パターンと呼ぶ)
import java.util.{ Date => UDate }
import sample.DateUtil2._
val udate = new UDate val sdate = udate.toSqlDate //java.util.DateのtoSqlDateメソッドを呼んでいるような形
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()) } }