読者です 読者をやめる 読者になる 読者になる

No Programming, No Life

新しいNPNLです。http://d.hatena.ne.jp/fumokmm/ から引っ越してきました。

GroovyなJDK、それがGDK(Enum編)


このシリーズの一覧はこちら

はじめに

GroovyにはJavaの標準API(JDK)を拡張したGroovy JDK(GDK)があります。大量の便利メソッドが追加されており、これを使いこなすだけでも相当のことができるようになります。このシリーズでは毎回1クラスずつ各メソッドの使用例をサンプル付きでご紹介していきたいと思います。
「今回は java.lang.Enum です」

EnumJava5から取り入れられた列挙を表現する便利なクラスです。ご存知無い方は是非このあたりを参考に勉強して見て下さい。
Enumに追加されているメソッドは二つだけですので、さらっと確認していただけると思います。両方とも演算子のオーバーライドです。

Object next() [since v?]

next()は++演算子をオーバーライドした動作を想定しているので、ここでは++演算子を使った例をご紹介します。*1
例としては普通のEnumでは面白くないので日本語を使って「干支」をEnumにしてみました。

enum 十二支 {
  子, 丑, 寅, 卯, 辰, 巳,
  午, 未, 申, 酉, 戌, 亥
}

// 最初は子年
def 干支 = 十二支.子

干支++ // 次の干支へ
assert 十二支.丑 == 干支

干支++ // 次の干支へ
assert 十二支.寅 == 干支

// 最後の干支へ
干支 = 十二支.亥
干支++ // 最後の干支の次の干支は?
assert 十二支.子 == 干支 // 1年巡って子に戻る

最後まで行くと最初に戻るのが便利ですね。

Object previous() [since v?]

previous()は--演算子をオーバーライドした動作を想定しているので、ここでは--演算子を使った例をご紹介します。*2
例としては普通のEnumでは面白くないので日本語を使って「干支」をEnumにしてみました。

enum 十二支 {
  子, 丑, 寅, 卯, 辰, 巳,
  午, 未, 申, 酉, 戌, 亥
}

// 亥年
def 干支 = 十二支.亥

干支-- // 前の干支へ
assert 十二支.戌 == 干支

干支-- // 前の干支へ
assert 十二支.酉 == 干支

// 最初の干支へ
干支 = 十二支.子
干支-- // 最初の干支の前の干支は?
assert 十二支.亥 == 干支 // 1年戻って亥に戻る

最初まで行くと最後に戻るのが便利ですね。

*1:++演算子を使用した場合、レシーバ自身が変化するが#next()を利用するとレシーバは変化しない(戻り値がレシーバの次の値)という違いがあるようです。

*2:--演算子を使用した場合、レシーバ自身が変化するが#previous()を利用するとレシーバは変化しない(戻り値がレシーバの前の値)という違いがあるようです。