- 浏览: 519088 次
- 性别:
- 来自: 武汉
-
文章分类
- 全部博客 (268)
- C/C++ (5)
- LUA (0)
- JVM (6)
- UML (1)
- J2SE (43)
- J2EE (15)
- EXTJS (1)
- HTML5 (47)
- ANDROID (2)
- JAVASCRIPT (51)
- WEB SERVICES (0)
- 数据库 (2)
- 数据结构 (0)
- 应用服务器 (11)
- 设计模式应用 (0)
- JAVA性能与缓存 (1)
- ByteCode (5)
- RCP (0)
- Plugin (0)
- Eclipse (3)
- 程序人生 (14)
- Mobile (2)
- Linux/Ubuntu (31)
- sublime (2)
- python (15)
- Git (5)
- NodeJs (3)
- Crosswalk (1)
- Browserify (1)
- Backbone (1)
最新评论
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();
与枚举类型一起添加进来的还有 enumset 和 enummap ,我会在下一篇文章中介绍。
这篇文章是参照 sun enum specification 写下来的,版权归 sun 公司所有哦!
发表评论
文章已被作者锁定,不允许评论。
-
关于Thread.IsAlive属性
2015-07-04 12:12 899今天在讨论多线程的时候,谈到了这个属性。IsAlive,顾名 ... -
Java:对象的强、软、弱和虚引用
2015-02-28 11:00 744文章源自:http://zhangjunhd.blog.51 ... -
一个通用并发对象池的实现
2015-01-20 09:32 747Source: http://ifeve.com/gener ... -
如何创建不可变的Java类或对象
2015-01-07 16:29 2202在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过 ... -
并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法
2014-12-29 11:49 814文章源自:http://www.cnblogs.com/li ... -
中断线程深入
2014-12-25 15:18 804本文转自http://jiangzhengjun.itey ... -
深入java.lang.ThreadLocal类
2014-12-24 16:50 719文章源自:http://lavasoft.blog.51c ... -
Java 8新特性探究(3):解开lambda最强作用的神秘面纱
2014-07-10 17:50 722文章源自:http://developer.51cto.co ... -
Java 8特性探究(2):深入解析默认方法
2014-07-08 11:12 797文章源自:http://develop ... -
Java 8特性探究(1):通往lambda之路_语法篇
2014-07-08 09:59 699文章源自:http://developer.51cto.c ... -
java文件复制方法参考
2013-12-02 14:17 750最快的文件复制方法 private static ... -
用Java数字签名提供XML安全
2013-11-29 16:11 13171文章源自:http://www. ... -
深入理解HashMap的工作原理
2013-11-18 15:49 836HashMap的工作原理是近 ... -
JDBC4.0 驱动加载过程
2013-01-16 10:09 3648注意,jdbc4.0不再需要显示调用class.fo ... -
Java自定义的类加载器
2013-01-15 08:38 1030一、类加载器类别 * 1.java虚拟机自带的加载器 ... -
使用Log4j生成不同日志级别的日志文件
2012-12-26 17:09 5351在src根目录下存放log4j.xml文件,具体配置如下(测试 ... -
深入理解HashMap
2012-12-13 10:08 876文章摘自:http://www.iteye.c ... -
java字节码加解密
2012-06-30 09:53 1117一.创建KEY class Key { ... -
java动态代理简单实现
2012-06-30 09:45 1035一.接口 public interface Foo { ... -
线程池简单实现
2012-06-25 11:42 1110其实线程池的实现就是生产者消费者问题 的实现,理解了生产者消 ...
相关推荐
public enum SingletonClass { INSTANCE; } ``` 调用方式是`SingletonClass.INSTANCE`。 总之,Java单例模式有多种实现方式,每种方式都有其适用场景和优缺点。选择哪种实现方式取决于项目需求,如是否需要...
枚举在Java中通过`enum`关键字来创建,它在很多方面类似于类,但具有更严格和固定的结构。以下是关于Java枚举类型的详细说明: 1. **枚举定义**: 当我们使用`enum`定义一个枚举类型时,实际上创建了一个继承自`...
浅析对java枚举类型的认识 java 枚举类型是 java 语言中的一种特殊类型,用于定义一组固定的常量。枚举类型可以看作是一种特殊的类,但它有着不同的特性和用途。下面我们来详细讲解 java 枚举类型的知识点。 一、...
浅析Java消息摘要与数字签名 消息摘要是指对消息或文本进行 Hash 加密处理后得到的固定长度值。它可以确保消息的完整性和不可篡改性。消息摘要算法的特点有:唯一性、不可逆、不需要密钥,可以用于分布式网络。 ...
首先,.NET框架是一个多语言的平台,支持多种编程语言如C#、VB.NET、F#等,而Java则是一个主要使用Java语言的单一平台。在编写C#代码时,我们可以利用各种编辑器的快捷键来提高效率,如Home键移动到行首非空白字符,...