2011年6月16日木曜日

Groovyでenumで遊んでみる。

Groovyでenumで遊んでみた。

まずは簡単なコードから。

enum Fruit{
    APPLE, ORANGE, BANANA, MANGO
}
Fruite.each(){
    println it
}


これの出力結果は次のとおりです。

APPLE
ORANGE
BANANA
MANGO


つぎは、『Effective Java』の項目30「int定数の代わりにenumを使用する」から写経してみました。


enum Planet{
    MERCURY(3.302e+23, 2.439e6),
    VENUS  (4.869e+24, 6.052e6),
    EARTH  (5.975e+24, 6.378e6),
    MARS   (6.419e+23, 3.393e6),
    JUPITER(1.899e+27, 7.149e7),
    SATURN (5.685e+26, 6.027e7),
    URANUS (8.683e+25, 2.556e7),
    NEPTUNE(1.024e+26, 2.477e7);
    
    private final double mass;   // kg
    private final double radius; // metre
    private final double surfaceGravity; // m / s*s
    // Gravitational Constant
    private static final double G = 6.67300E-11
    
    // Constructor
    Planet(double mass, double radius){
        this.mass = mass
        this.radius = radius
        surfaceGravity = G * mass / (radius * radius)
    }
    
    public double surfaceWeight(double mass){
        mass * surfaceGravity
    }
}

Planet.each(){
    println "${it.toString()}"
    println "mass -> ${it.mass}"
    println "radius -> ${it.radius}"
    println "surfaceGrabity -> ${it.surfaceGravity}"
    print "surfaceWeight -> "
    println "${it.surfaceWeight(20.0 / Planet.EARTH.surfaceGravity)}"
    println ""
}

println 20.0 / Planet.EARTH.surfaceGravity


私、これ書いていて気付いたんですけど、enumってコンストラクター持てるんですね。

実行結果は以下のとおりです。

MERCURY
mass -> 3.302E23
radius -> 2439000.0
surfaceGrabity -> 0.0
surfaceWeight -> NaN

VENUS
mass -> 4.869E24
radius -> 6052000.0
surfaceGrabity -> 0.0
surfaceWeight -> NaN

EARTH
mass -> 5.975E24
radius -> 6378000.0
surfaceGrabity -> 0.0
surfaceWeight -> NaN

MARS
mass -> 6.419E23
radius -> 3393000.0
surfaceGrabity -> 0.0
surfaceWeight -> NaN

JUPITER
mass -> 1.899E27
radius -> 7.149E7
surfaceGrabity -> 0.0
surfaceWeight -> NaN

SATURN
mass -> 5.685E26
radius -> 6.027E7
surfaceGrabity -> 0.0
surfaceWeight -> NaN

URANUS
mass -> 8.683E25
radius -> 2.556E7
surfaceGrabity -> 0.0
surfaceWeight -> NaN

NEPTUNE
mass -> 1.0239999999999999E26
radius -> 2.477E7
surfaceGrabity -> 0.0
surfaceWeight -> NaN

Infinity


どうも、surfaceWeightの値がNaNになるので、調べてみたら、20 / Planet.EARTH.surfaceGravityが無限だったようで、そりゃNaNになるわな。

0 件のコメント:

コメントを投稿