- 浏览: 245296 次
- 性别:
- 来自: LA
文章分类
- 全部博客 (84)
- java 技术 (16)
- spring MVC (1)
- spring framework (5)
- 正则 (1)
- Rest (1)
- log4j (1)
- java 线程 (7)
- 算法 (1)
- 版本控制 (7)
- WEB 前端 (4)
- 搜索 (3)
- 系统架构 (3)
- 设计模式 (2)
- 杂 (2)
- SOA (3)
- JAVA 数据库 (1)
- android (3)
- 数据库挖掘 (2)
- linux (3)
- web server (2)
- 分布式 (1)
- hadoop 相关 (3)
- ant&&maven (1)
- 性能调优 (2)
- javascript (2)
- sql (1)
- cookie (1)
- java 调试 (1)
- MYSQL (2)
- 数据库 (3)
最新评论
-
wangtuda:
git commit -amend是git commit -- ...
git 修改 已经提交了的注释 -
threenoodles:
...
java enum -
songjiesdnu:
...
java enum -
xy2401:
前面还好,看到后面好乱
spring annotation -
wf6916311:
Cookie
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("3"); double y = Double.parseDouble("2"); for (Operation op : Operation.values()) System.out.printf("%f %s %f = %f%n", x, op, y, op.eval(x, y)); System.out.println(Operation.valueOf("PLUS").eval(x, y)); } } public enum RandomStr { /** * 只有数字 */ Number("0123456789"), /** * 包含数字和大小写字符 */ NumberAndChar("abcdefghjkmnpqrstuvwxyz23456789ABCDEFGHJKLMNPQRSTUVWXYZ"), /** * 包含数字和大写字符 */ NumberAndCharIgnoreCase("ABCDEFGHJKLMNPQRSTUVWXYZ23456789"), /** * 数字和字符平均出现 */ AvgNumberAndCharIgnoreCase( "ABCDEFGHJKLMNPQRSTUVWXYZ234567892345678923456789"); /** * 原始值 */ private String original; /** * 产生指定长度的随机码。 */ public String rand(int length) { String codes = ""; if (length > 0) { int max = original.length(); long seed = System.currentTimeMillis(); Random random = new Random(seed); for (int i = 0; i < length; i++) { codes += original.charAt(random.nextInt(max)); } } return codes; } /** * 私有构造器。 */ private RandomStr(String original) { this.original = original; } }
注意:JDK4.0以前的都不支持,转成5.0以上才支持
jdk5.0发布以后,添加了枚举类型,其实当初在从Delphi转向Java的时候,我就在为java中没有枚举这个功能感到不可思议。因为枚举类型在很多方面有着独特作用,现在好了,java中添加了这项功能,今天我就试了试,还满好的。
java中的枚举类型包括了其他语言中枚举类型的一般特性。
class EnumDemo{
public enum Seasons {
winter,spring,summer,fall;
}
public static void main(String[] args){
for(Seasons s:Seasons.values())
System.out.println(s);
}
}
运行结果:
winter
spring
summer
fall
上面这个例子,展示了枚举类型的一般用法,在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) { //枚举类不需要被实例化,所以构造器是私有的private,不加默认为私有类型
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
在这里我们可以看到这个枚举类中含有一个带有两个参数的构造函数。通过构造函数我们可以产生含有不同数据特征的星球对象。Planet 的构造函数参数值从枚举常量里获取,如:
当遍历到水星时 MERCURY (3.303e+23, 2.4397e6), //水星
就会把里面的值3.303e+23传给mass, 而2.4397e6传给radius
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
在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,我会在下一篇文章中介绍。
Enum是enumeration(列举)的简写形式,包含在java.lang包中.熟悉C, C++, C
#, 或 Pascal人应该对列举有所了解,先看个例子:
public enum Season { winter, spring, summer, fall }
一个enum是定义一组值的对象,它可以包括零个或多个值成员.它是属于enum类型的,一个enum对象中不可有两个或多个相同的属性或值.在次之前的java程序员一般是 用接口的方法实现列举的,如 :
public interface Season {
static winter = 0;
static spring = 1; //etc..
}
引入了enum的java的列举的编写方便了许多,只须定义一个enum型的对象.enum对象的值都回自动获得一个数字值,从0开始,依次递增.看一个比较简单的enum实现的例子:
EnumDemo.java
package net.javagarage.enums;
/*
We can loop over the values we put into the enum
using the values() method.
Note that the enum Seasons is compiled into a
separate unit, called EnumDemo$Seasons.class
*/
public class EnumDemo {
/*declare the enum and add values to it. note that, like in C#, we don't use a ; to
end this statement and we use commas to separate the values */
private enum Seasons { winter, spring,
summer, fall }
//list the values
public static void main(String[] args) {
for (Seasons s : Seasons.values()){
System.out.println(s);
}
}
}
运行上述代码你回得到 以下结果:
winter
spring
summer
fall
Enum的属性调用:
下面的代码展示了调用enum对象的方法,这也是它通常的用法:
package net.javagarage.enums;
/*
File: EnumSwitch.java
Purpose: show how to switch against the values in an enum.
*/
public class EnumSwitch {
private enum Color { red, blue, green }
//list the values
public static void main(String[] args) {
//refer to the qualified value
doIt(Color.red);
}
/*note that you switch against the UNQUALIFIED name. that is, "case Color.red:" is a
compiler error */
private static void doIt(Color c){
switch (c) {
case red:
System.out.println("value is " + Color.red);
break;
case green:
System.out.println("value is " + Color.green);
break;
case blue:
System.out.println("value is : " + Color.blue);
break;
default :
System.out.println("default");
}
}
}
为enums添加属性和方法
enums也可以象一般的类一样添加方法和属性,你可以为它添加静态和非静态的属性或方法,这一切都象你在一般的类中做的那样.
package net.javagarage.enums;
/*
File: EnumDemo.java
Purpose: show how to use an enum that also defines its own fields and methods
*/
public class EnumWithMethods {
//declare the enum and add values to it.
public enum Season {
winter, spring, summer, fall;
private final static String location = "Phoenix";
public static Season getBest(){
if (location.equals("Phoenix"))
return winter;
else
return summer;
}
public static void main(String[] args) {
System.out.println(Season.getBest());
}
}
就是这么的简单.但是有一点是需要注意的,那就是enums的值列表必须紧跟在enum声明,不然编译时将会出错.
Enums构造函数:
和类一样enums也可以有自己的构造函数,如下:
package net.javagarage.enums;
public class EnumConstructor {
public static void main(String[] a) {
//call our enum using the values method
for (Temp t : Temp.values())
System.out.println(t + " is : " + t.getValue());
}
//make the enum
public enum Temp {
absoluteZero(-459), freezing(32),
boiling(212), paperBurns(451);
//constructor here
Temp(int value) {
this.value = value;
}
//regular field?but make it final,
//since that is the point, to make constants
private final int value;
//regular get method
public int getValue() {
return value;
}
}
}
输出结果是:
absoluteZero is : -459
freezing is : 32
boiling is : 212
paperBurns is : 451
尽管enums有这么多的属性,但并不是用的越多越好,如果那样还不如直接用类来的直接.enums的优势在定义int最终变量仅当这些值有一定特殊含义时.但是如果你需要的是一个类,就定义一个类,而不是enum.
发表评论
-
JAVA逻辑运算符&&||&|区别
2012-09-19 09:37 1414逻辑运算符 Logical Operator 逻辑运算符只对 ... -
安装Eclipse反编译插件
2012-03-30 10:14 1581一、前提: 1、已经安装了Eclipse,如我的Eclip ... -
java list to array
2012-03-13 19:41 1116/** * cast list to array ... -
java 动态代理
2012-02-04 20:37 1108(3.) 基于Proxy的动态代理: JAVA 自带的动态代理 ... -
java Class 及 RTTI 相关
2012-02-04 19:52 1441运行时类型信息(RunTime Type Informatio ... -
java classloader
2011-12-24 17:29 1285java.lang.NoClassDefFoundError: ... -
Java内存管理的9个小技巧
2011-12-20 17:28 7511、别用new Boolean()。 ... -
java enum 学习
2011-12-05 20:17 1950关键字: java enum 在像C这样强调数据结构的语言里, ... -
【转】Java中的Enum的使用与分析
2011-12-05 20:05 1575示例: public enum EnumTest { ... -
java Map 遍历 Map.Entry
2011-11-23 14:00 2047package com.talent.platform.dem ... -
笔记一
2011-11-22 20:34 889/** * The minimum prio ... -
【转】instanceof和isInstance(Object obj) 和isAssignableFrom(Class cls)的区别和联系
2011-11-22 20:29 1582编程的时候可能会遇到一个不知道它属于哪个类的对象,我们可以用下 ... -
【转】同步块和同步方法
2011-11-08 11:08 1064打个比方:一个object就 ... -
java Date
2011-11-06 12:10 10561.计算某一月份的最大天数 Calendar tim ... -
【转】浅析 Java Thread.join()
2011-11-04 10:32 848一、在研究join的用法之前,先明确两件事情。 1.join ...
相关推荐
"Java Enum 枚举学习资料" Java Enum 枚举学习资料是 Java 编程语言中的一种特殊类型,它主要用来实现一组固定的常量。 Enum 枚举类型是 Java 5 中引入的一种新特性,旨在解决传统的 int 枚举常量的缺陷。 1. 枚举...
Java enum 的用法详解 Java enum(枚举)是一种特殊的数据类型,用于定义一组固定的常量。从 JDK 1.5 开始,Java 引入了 enum 机制,解决了传统的常量定义方式的不足。 用法一:常量 在 JDK 1.5 之前,我们定义...
在Java编程语言中,枚举(Enum)是一种特殊的类,用于定义固定的常量集合。它在许多场景下比常量接口或静态final变量更安全、更方便。本篇将通过"Java Enum使用Demo源码"深入探讨Java枚举的用法。 首先,枚举在Java...
Java 枚举(enum)是Java 1.5 引入的一种新的数据类型,它用于表示一组相关的值,这些值可以被当作常量来使用。枚举类型比传统的静态常量更加安全,可读性更好,并且允许进行更丰富的定制。下面我们将详细探讨Java ...
在Java编程语言中,枚举(`enum`)是一种强大的工具,它允许我们定义一组预定义的常量。在Spring Boot 2.x框架中,枚举的使用可以帮助我们更好地管理和组织代码,提供类型安全和可读性。本篇将深入探讨如何在Spring ...
### Java的Enum知识点详解 #### 一、枚举的基本概念 在Java中,`enum`(枚举)是一种特殊的类,用于定义一组常量值。它可以帮助开发者限制一个变量的可能值,使其只能从预定义的一组选项中选择。枚举提供了一种更...
Java Enum和String及int的相互转化示例 Java Enum和String及int的相互转化示例是Java编程语言中的一种重要技术,通过本文,我们将详细介绍Java Enum和String及int的相互转化示例,并提供详细的示例代码,帮助大家更...
以下是对`javaenum学习.pdf`中提到的Java枚举相关知识点的详细说明: 1. **枚举元素定义**: - 枚举元素的列表必须写在枚举类的开头,元素之间用逗号分隔。如果元素列表后面没有其他内容,可以不加分号;如果有...
Java 枚举(enum)是Java 1.5版本引入的一种强大的类型,它允许开发者定义一组预定义的常量,这些常量具有特定的名称和顺序。枚举在很多场景下替代了传统的常量定义方式,增加了代码的可读性和安全性。 首先,枚举...
在Java编程语言中,`enum`(枚举)是一种强大的类型,它允许开发者定义一组预定义的常量。枚举在许多方面都优于传统的静态常量,因为它提供了更多的功能和灵活性。以下是对Java `enum`的详细用法和实例代码的深入...
Java枚举类型(Enum)是Java SE 5.0引入的一种新的数据类型,它为开发者提供了更为强大且安全的方式来表示一组常量。枚举在Java中不仅是一个类,还是一种特殊的类型,允许我们定义自己的常量集合。接下来,我们将...
Java枚举(enum)是Java语言提供的一种特殊的数据类型,用于定义一组有限的常量,这些常量在程序中作为固定的值使用。枚举在Java中是类的子类型,因此,它们具备类的一些特性,比如可以有方法、变量以及实现接口。...
Java中的枚举(enum)是自JDK 1.5版本引入的一种强大的类型,它用于定义一组相关的常量。枚举在Java中被设计为一种特殊的类,它们默认继承自`java.lang.Enum`抽象类,并且是单继承的,这意味着它们无法再继承其他类...
java初学者内容对于enum类型,可能仅仅停留在枚举项只有一个字段的数据,在实际开发中可能对着每个枚举项包含几个信息,key value,学生姓名,年龄,身高等,样例详细定义了包含多个值enum类型并使用,请参考文件
### Java中的Enum深入解析 #### 引言 在Java编程语言中,`Enum`是一种特殊的数据类型,用于处理一组固定的常量。它不仅提供了一种更安全、更灵活的方式来表示一组固定的选择,还包含了丰富的内置功能,使得枚举...
Java enum关键字是自Java 5版本引入的一种类型,用于创建枚举类,它允许开发者定义一组固定的常量。然而,在某些情况下,开发人员可能会遇到IDE(如MyEclipse)不识别enum关键字的问题,这通常是由于IDE配置不当或...
简单查询算法,供学习参考。 代码中描述了Enum和EnumMap类的使用。
在Java编程语言中,枚举(enum)是一种特殊的类,用于定义一组固定的常量。它在许多场景下比使用常量或int类型的硬编码值更安全、更具可读性。本篇文章将深入探讨Java枚举的特性、用法以及如何在实际开发中充分利用...
Java中的枚举(enum)类型是在JDK 1.5版本引入的一个强大的特性,它用于定义一组相关的常量。在C/C++等语言中,枚举通常用来表示一组具有固定值的常量集合,但在Java中,枚举不仅限于此,它提供了更多的功能和灵活性...