• <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

            文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見(jiàn)諒!~
            隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

            java enum 淺析

            jdk5.0發(fā)布以后,添加了枚舉類型,其實(shí)當(dāng)初在從Delphi轉(zhuǎn)向Java的時(shí)候,我就在為java中沒(méi)有枚舉這個(gè)功能感到不可思議。因?yàn)槊杜e類型在很多方面有著獨(dú)特作用,現(xiàn)在好了,java中添加了這項(xiàng)功能,今天我就試了試,還滿好的。
                                                                                               

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

            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);
            }
            }
            上面這個(gè)例子,展示了枚舉類型的一般用法,在java的枚舉類中提供了靜態(tài)values()方法以供循環(huán)迭代時(shí)使用。大家再看一看下面這個(gè)例子:

            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);

               }

            }

            }


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


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


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

            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));

                 }


            }
            運(yùn)行結(jié)果:

            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

            在這里我們可以看到這個(gè)枚舉類中含有一個(gè)帶有兩個(gè)參數(shù)的構(gòu)造函數(shù)。通過(guò)構(gòu)造函數(shù)我們可以產(chǎn)生含有不同數(shù)據(jù)特征的星球?qū)ο蟆T?span lang="EN-US">main()函數(shù)中,我們通過(guò)有不同的星球調(diào)用相同的方法來(lái)得到物體在該星球上的重量。


            我們可以把為枚舉常量添加行為的主意更向前推進(jìn)一步。我們可以為不同枚舉常量添加不同的行為。通過(guò)使用switch語(yǔ)句是達(dá)到這個(gè)目的的一種方法。下面就有一個(gè)實(shí)例:

            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);

                 }

            }


            它工作的非常好,當(dāng)時(shí)如果沒(méi)有throw語(yǔ)句的話,它將不能通過(guò)編譯,因此它就顯得不是那么完美了。更加糟糕的是,你一定要記住在你向枚舉類中添加枚舉變量時(shí),你要為這個(gè)變量添加操作。如果你忘了的話,eval方法將會(huì)操作失敗。


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

            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));

                 }

            }

            運(yùn)行結(jié)果:
            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


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

            class MyenumOperation implements enumOperation

            {

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

            }

            MyenumOperation plus = new MyenumOperation();


            與枚舉類型一起添加進(jìn)來(lái)的還有enumsetenummap.

             

            posted on 2009-06-15 11:22 肥仔 閱讀(305) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Web-后臺(tái)

            久久夜色精品国产噜噜噜亚洲AV| 国产精品久久久天天影视| 久久久久成人精品无码中文字幕 | 无码AV波多野结衣久久| 久久天堂AV综合合色蜜桃网 | 欧美日韩精品久久久免费观看| 久久99精品久久久大学生| 国产亚洲欧美成人久久片| 四虎亚洲国产成人久久精品| 久久精品人人做人人妻人人玩| 久久99久久无码毛片一区二区| 久久99久国产麻精品66| 久久久噜噜噜久久| 久久婷婷五月综合97色一本一本| 91久久精品国产免费直播| 伊人久久大香线蕉亚洲五月天| 91精品国产91久久久久久青草 | 日韩人妻无码一区二区三区久久99 | 久久亚洲精品无码播放| 久久国产精品77777| 亚洲欧美另类日本久久国产真实乱对白 | 久久国产亚洲精品无码| 久久亚洲天堂| 色综合久久最新中文字幕| 久久这里只精品99re66| 久久精品国产WWW456C0M| 国产精品免费看久久久| 日产精品久久久一区二区| 久久精品国产欧美日韩99热| 天天综合久久一二三区| 青青草原综合久久大伊人导航 | 狠狠久久亚洲欧美专区| AV无码久久久久不卡网站下载| 精品国产青草久久久久福利| 青青草原综合久久大伊人| 伊色综合久久之综合久久| 久久综合狠狠综合久久97色| 久久亚洲精品国产精品婷婷| 国产69精品久久久久久人妻精品| 欧美成人免费观看久久| 一本色道久久88—综合亚洲精品|