今天第一天看<<Effective Java>>,看了第六章的第一条就是全书的第30条--用enum代替int常量。

1.第一次知道原来enum也可以像class那样拥有成员函数。举个四则运算的例子:

package com.wjy.test;

public enum Operation {
PLUS,MINUS,TIMES,DIVIDE;
double apply(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);
}
}

调用代码:

package com.wjy.test;
public class Test {
public static void main(String args[]){
System.out.println(Operation.PLUS.apply(1.0,2.2));
}
}

但是上述方式有一个问题,就是不利于扩展。若添加一个新的枚举常量还要更改switch添加一条语句,所以这种模式是很脆弱的。

有一种好的模式可以将不同的行为与每个枚举常量关联起来。

2.将不同的行为与每个枚举常量关联的办法:

package com.wjy.test;

public enum Operation {
PLUS{ double apply(double x,double y){return x+y;} },
MINUS{ double apply(double x,double y){return x-y;} },
TIMES{ double apply(double x,double y){return x*y;} },
DIVIDE{ double apply(double x,double y){return x/y;} }; abstract double apply(double x,double y);
}

调用代码

package com.wjy.test;
public class Test {
public static void main(String args[]){
System.out.println(Operation.PLUS);
System.out.println(Operation.PLUS.apply(1.0,2.2));
}
}

运行结果:

//结果
PLUS
3.2

问题又出现了,为什么输出的是"PLUS"而不是”+“,为了让他输出"+",应该覆盖toString方法。

3.重载toString()

package com.wjy.test;

public enum Operation {
PLUS("+"){ double apply(double x,double y){return x+y;} },
MINUS("-"){ double apply(double x,double y){return x-y;} },
TIMES("*"){ double apply(double x,double y){return x*y;} },
DIVIDE("/"){ double apply(double x,double y){return x/y;} }; private final String symbol;
Operation(String symbol) {
this.symbol=symbol;
}
@Override
public String toString(){
return symbol;
}
abstract double apply(double x,double y);
}

则Option.PLUS和"+"关联起来了。

Java提供的enum详解的更多相关文章

  1. JAVA中枚举Enum详解

    1.关键字:enum.枚举可以定义成单独的文件,也可以定义在其他类内部. 枚举在类内部的示例: public class EnumInner { public static void main(Str ...

  2. Java 枚举(enum) 详解7种常见的用法

    Java 枚举(enum) 详解7种常见的用法 来源 https://blog.csdn.net/qq_27093465/article/details/52180865 JDK1.5引入了新的类型— ...

  3. java中的注解详解和自定义注解

    一.java中的注解详解 1.什么是注解 用一个词就可以描述注解,那就是元数据,即一种描述数据的数据.所以,可以说注解就是源代码的元数据.比如,下面这段代码: @Override public Str ...

  4. Java 8 Stream API详解--转

    原文地址:http://blog.csdn.net/chszs/article/details/47038607 Java 8 Stream API详解 一.Stream API介绍 Java8引入了 ...

  5. java反射机制深入详解

    java反射机制深入详解  转自:http://www.cnblogs.com/hxsyl/archive/2013/03/23/2977593.html 一.概念 反射就是把Java的各种成分映射成 ...

  6. 国际化,java.util.ResourceBundle使用详解

    java.util.ResourceBundle使用详解   一.认识国际化资源文件   这个类提供软件国际化的捷径.通过此类,可以使您所编写的程序可以:          轻松地本地化或翻译成不同的 ...

  7. java.util.ResourceBundle使用详解

    java.util.ResourceBundle使用详解   一.认识国际化资源文件   这个类提供软件国际化的捷径.通过此类,可以使您所编写的程序可以:          轻松地本地化或翻译成不同的 ...

  8. java.util.ResourceBundle使用详解(转)

    java.util.ResourceBundle使用详解   一.认识国际化资源文件   这个类提供软件国际化的捷径.通过此类,可以使您所编写的程序可以:          轻松地本地化或翻译成不同的 ...

  9. java web.xml配置详解(转)

    源出处:java web.xml配置详解 1.常规配置:每一个站的WEB-INF下都有一个web.xml的设定文件,它提供了我们站台的配置设定. web.xml定义: .站台的名称和说明 .针对环境参 ...

随机推荐

  1. javascript 中 事件流和事件冒泡

    一.事件流 是描述页面接受事件的顺序,IE 使用的是时间冒泡流;而Netscape的事件采用的是事件捕获流.1.事件冒泡JS 和 HTML是通过事件的方式实现交互.事件冒泡 开始元素,将事件逐级传递, ...

  2. Round Numbers

    转载请注明出处:優YoU http://user.qzone.qq.com/289065406/blog/1301472836 大致题意: 输入两个十进制正整数a和b,求闭区间 [a ,b] 内有多少 ...

  3. C# LDAP认证登录

    LDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP.它是基于X.500标准的,但是简单多了并且可以根据需要定制.与X ...

  4. 设计模式6:Composite

    Entry.java: package gendwang.cisco.com; public abstract class Entry { private int height = 0; privat ...

  5. hbase memstorelab

    关于MemStore的补充 在通过HStore.add向store中加入�一个kv时,首先把数据写入到memstore中.这一点没有什么说明: publiclongadd(finalKeyValue ...

  6. 译文:前端性能的重要性 The Importance of Frontend Performance

    欢迎訪问我的主页.最新的文章我会首先公布在个人主页上: http://blog.guaidm.com/shocky/ 原书下载地址:http://pan.baidu.com/s/1pJocRwB 在我 ...

  7. 一个与Log4j相关的死锁(转)

    这个死锁的原因:一个动作需要两个临界对象.静态同步方法,就是一个临界对象.这种场景,静态同步方法每次只能有一个线程持有.如果存在另一个临界对象,静态同步方法中也需要获取这个临界对象.即一个动作需要两个 ...

  8. VIM 用正则表达式

    VIM 用正则表达式 批量替换文本,多行删除,复制,移动 在VIM中 用正则表达式 批量替换文本,多行删除,复制,移动 :n1,n2 m n3     移动n1-n2行(包括n1,n2)到n3行之下: ...

  9. SqlHelper初探之二

    在上一篇简单的介绍了sqlhelper的基本知识,接下来就让我们进一步学习他的实践过程. 首先:我们要明白的一件事Sqlhelper不是写出来的,而是在D层的代码中提炼出来的?那么就会反问一句“D层中 ...

  10. CF437D(The Child and Zoo)最小生成树

    题目: D. The Child and Zoo time limit per test 2 seconds memory limit per test 256 megabytes input sta ...