• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woaidongmao

            文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
            數據加載中……

            java enum 淺析

            jdk5.0發布以后,添加了枚舉類型,其實當初在從Delphi轉向Java的時候,我就在為java中沒有枚舉這個功能感到不可思議。因為枚舉類型在很多方面有著獨特作用,現在好了,java中添加了這項功能,今天我就試了試,還滿好的。
                                                                                               

            java中的枚舉類型包括了其他語言中枚舉類型的一般特性。

            public class EnumDemo{
               public enum Seasons {
                winter,spring,summer,fall;
            }
            public static void main(String[] args){
               for(Seasons s:Seasons.values()){
                System.out.println(s);
            }
            }
            上面這個例子,展示了枚舉類型的一般用法,在java的枚舉類中提供了靜態values()方法以供循環迭代時使用。大家再看一看下面這個例子:

            public enum Seasons {

            winter,

            spring,

            summer,

            fall;

            //list the values

            public static void main(String[] args) {

            for(Seasons s:Seasons.values())

               {

                  System.out.println(s);

               }

            }

            }


            這兩個例子得出的是一樣的結果。由此可知enum關鍵字是代表一個類相當于class的意思,但是它又比class的范圍要小,僅僅代表枚舉類而已。


            java
            中的枚舉類除了有這些一般的功能外還包括一些特殊的功能,例如:枚舉類型可以有構造函數、可以添加任意多的方法和屬性;同時枚舉類型還可以為不同的屬性添加不同的方法。


            在這里我們假設你希望向一個枚舉類中添加數據和行為。例如我們可以設想一下銀河系的星球。每個星球的它自己的特定數據,由此來計算物體在其表面上的重量。下面就是實例:

            public enum Planet {

                 MERCURY (3.303e+23, 2.4397e6),

                 VENUS    (4.869e+24, 6.0518e6),

                 EARTH    (5.976e+24, 6.37814e6),

                 MARS     (6.421e+23, 3.3972e6),

                 JUPITER (1.9e+27,    7.1492e7),

                 SATURN   (5.688e+26, 6.0268e7),

                 URANUS   (8.686e+25, 2.5559e7),

                 NEPTUNE (1.024e+26, 2.4746e7),

                 PLUTO    (1.27e+22,   1.137e6);

                 private final double mass;    // in kilograms

                 private final double radius; // in meters

                 Planet(double mass, double radius) {

                     this.mass = mass;

                     this.radius = radius;

                 }

                 public double mass()    { return mass; }

                 public double radius() { return radius; }


                 // universal gravitational constant   (m 3 kg -1 s-2)

                 public static final double G = 6.67300E-11;


                 public double surfaceGravity() {

                     return G * mass / (radius * radius);

                 }

                 public double surfaceWeight(double otherMass) {

                     return otherMass * surfaceGravity();

                 }

                 public static void main(String[] args) {

                     double earthWeight = Double.parseDouble(args[0]);

                     double mass = earthWeight/EARTH.surfaceGravity();

                     for (Planet p : Planet.values())

                        System.out.printf("Your weight on %s is %f%n",

                                          p, p.surfaceWeight(mass));

                 }


            }
            運行結果:

            C:\java>java Planet 60
            Your weight on MERCURY is 22.665457
            Your weight on VENUS is 54.299946
            Your weight on EARTH is 60.000000
            Your weight on MARS is 22.724231
            Your weight on JUPITER is 151.833452
            Your weight on SATURN is 63.960932
            Your weight on URANUS is 54.307632
            Your weight on NEPTUNE is 68.299684
            Your weight on PLUTO is 4.012468

            在這里我們可以看到這個枚舉類中含有一個帶有兩個參數的構造函數。通過構造函數我們可以產生含有不同數據特征的星球對象。在main()函數中,我們通過有不同的星球調用相同的方法來得到物體在該星球上的重量。


            我們可以把為枚舉常量添加行為的主意更向前推進一步。我們可以為不同枚舉常量添加不同的行為。通過使用switch語句是達到這個目的的一種方法。下面就有一個實例:

            public enum Operation {

                 PLUS, MINUS, TIMES, DIVIDE;

                 // Do arithmetic op represented by this constant

                 double eval(double x, double y){

                     switch(this) {

                         case PLUS:    return x + y;

                         case MINUS:   return x - y;

                         case TIMES:   return x * y;

                         case DIVIDE: return x / y;

                     }

                     throw new AssertionError("Unknown op: " + this);

                 }

            }


            它工作的非常好,當時如果沒有throw語句的話,它將不能通過編譯,因此它就顯得不是那么完美了。更加糟糕的是,你一定要記住在你向枚舉類中添加枚舉變量時,你要為這個變量添加操作。如果你忘了的話,eval方法將會操作失敗。


            這里有另外一種給枚舉常量添加行為的方法。使用這種方法你可以避免上面說提到的問題。你可以在枚舉類型中添加一個abstract方法,然后在每一個枚舉常量中重載它。這就是有名的constant-specific方法。下面就是用這種技術對以前實例的重寫:

            public enum Operation {

               PLUS    { double eval(double x, double y) { return x + y; } },

               MINUS   { double eval(double x, double y) { return x - y; } },

               TIMES   { double eval(double x, double y) { return x * y; } },

               DIVIDE { double eval(double x, double y) { return x / y; } };


               // Do arithmetic op represented by this constant

               abstract double eval(double x, double y);

               public static void main(String args[]) {

                     double x = Double.parseDouble(args[0]);

                     double y = Double.parseDouble(args[1]);

                     for (Operation op : Operation.values())

                         System.out.printf("%f %s %f = %f%n", x, op, y, op.eval(x, y));

                 }

            }

            運行結果:
            C:\java>java Operation 24 56
            24.000000 PLUS 56.000000 = 80.000000
            24.000000 MINUS 56.000000 = -32.000000
            24.000000 TIMES 56.000000 = 1344.000000
            24.000000 DIVIDE 56.000000 = 0.428571


            大家可能會不太明白“PLUS    { double eval(double x, double y) { return x + y; } }”的意思。其實如果大家理解內部類的話,可能就不難理解這句話的含義了。我的理解是:

            class MyenumOperation implements enumOperation

            {

                 double eval(double x, double y) { return x + y; }

            }

            MyenumOperation plus = new MyenumOperation();


            與枚舉類型一起添加進來的還有enumsetenummap.

             

            posted on 2009-06-15 11:22 肥仔 閱讀(301) 評論(0)  編輯 收藏 引用 所屬分類: Web-后臺

            久久99国产精品久久久| 欧美亚洲日本久久精品| 久久亚洲精品中文字幕| 国产成人久久精品一区二区三区 | 日产精品久久久一区二区| 久久久久无码精品国产不卡| 丰满少妇人妻久久久久久4| 亚洲日本久久久午夜精品| 97久久久精品综合88久久| 香蕉99久久国产综合精品宅男自 | 综合人妻久久一区二区精品| 99久久精品午夜一区二区| 色8激情欧美成人久久综合电| 国产亚洲精品美女久久久| 一级女性全黄久久生活片免费| 久久精品aⅴ无码中文字字幕不卡| 国产呻吟久久久久久久92| 蜜臀久久99精品久久久久久小说 | 久久国产热精品波多野结衣AV| 欧美性猛交xxxx免费看久久久| 97久久精品人妻人人搡人人玩| 久久精品国产免费观看三人同眠| 国产三级精品久久| 久久婷婷久久一区二区三区| 蜜臀av性久久久久蜜臀aⅴ麻豆| 精品无码久久久久久久动漫| 99精品久久久久中文字幕| 久久婷婷激情综合色综合俺也去| 欧美日韩精品久久久久| 久久最新免费视频| 久久久久国产一区二区三区| 久久精品国产91久久综合麻豆自制| 麻豆成人久久精品二区三区免费| 色妞色综合久久夜夜| 久久人人添人人爽添人人片牛牛| 欧美久久亚洲精品| 久久久噜噜噜久久中文字幕色伊伊| 亚洲国产香蕉人人爽成AV片久久| 免费一级做a爰片久久毛片潮 | 色综合久久夜色精品国产| 怡红院日本一道日本久久 |