Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 351|回复: 0

[枚举学习]enum 浅析

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-29 23:57:12 | 显示全部楼层 |阅读模式
    jdk5.0发布以后,添加了枚举类型,其实当初在从Delphi转向java的时候,我就在为java中没有枚举这个功能感到不可思议。因为枚举类型在很多方面有着独特作用,现在好了,java中添加了这项功能,今天我就试了试,还满好的。
                                                                                          java中的枚举类型包括了其他语言中枚举类型的一般特性。
    1. public class EnumDemo{
    2.   public enum Seasons {
    3.    winter,spring,summer,fall;
    4. }
    5. public static void main(String[] args){
    6.   for(Seasons s:Seasons.values()){
    7.    System.out.println(s);
    8. }
    9. }
    复制代码

      
      
      上面这个例子,展示了枚举类型的一般用法,在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();  
         
          
           与枚举类型一起添加进来的还有enumset和enummap,我会在下一篇文章中介绍。 ps:这篇文章我是参照sun enum specification写下来的,版权归sun公司所有哦!!!   
       
         
         
          
          

            
          

            
          
         
          
      


    源码下载:http://file.javaxxz.com/2014/10/29/235712437.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-18 22:09 , Processed in 0.381506 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表