今天第一天看<<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. 对于面向对象的理解(JAVA)

    JAVA 是一门优美的面向对象的语言.那问题就来了什么是对象,这个问题有一个简单的诠释 “万物皆对象”.那么在面向对象编程中对象是类的一个实例,那么什么是类呢?类是一组相似对象的共有特征的抽象.类有什 ...

  2. CentOS6.4 安装 Oracle11g

    1.硬件要求检查: 1.1 内存要求: 内存大于1G(使用虚拟机安装时内存要稍微大一些,否则安装检查不通过) #cat /proc/meminfo //查看内存大小 1.2 交换分区要求: 交换分区是 ...

  3. Android:解决client从server上获取数据乱码的方法

    向server发送HTTP请求.接收到的JSON包为response,用String content = EntityUtils.toString(response.getEntity()," ...

  4. C++学习之路—引用(一)—基础知识

    (根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 对一个数据可以建立一个“引用”,它的作用是为一个 ...

  5. Entity - 使用EF框架进行增删改查 - 模型先行

    模型先行:先创建数据库实体模型,然后再进行数据库的增删改查. 基本步骤是不变的,可参照 <Entity - 使用EF框架进行增删改查 - 数据库先行> 其中的不同是,在创建数据库实体模型的 ...

  6. 也谈C#之Json,从Json字符串到类代码

    原文:也谈C#之Json,从Json字符串到类代码  阅读目录 json转类对象 逆思考 从json字符串自动生成C#类  json转类对象 自从.net 4.0开始,微软提供了一整套的针对json进 ...

  7. NetBeans + Xdebug 调试WordPress

    用NetBeans进行WordPress的相关开发和定制很顺手,配合Xdebug后调试起来也很方便. 详细配置过程如下(本例中Xampp安装目录为D:\xampp): 1: 下载xdebug(版本需匹 ...

  8. 【OpenMesh】Some basic operations: Flipping and collapsing edges

    这一节中你将学到一些OpenMesh中早已提供的基础操作. 内容包括三角形网格边的翻转以及通过连接邻接的顶点边缘折叠. 三角形网格的翻转(Flipping edges) 考虑到两个邻接面的三角形网格中 ...

  9. 让工程师爱上CMM,实现管理于无形 --- 中标软件CMMI L5之路 (2/2)

    上节:见 http://blog.csdn.net/sztiger168/article/details/9142069 使用 青铜器RDM在2011年正式在中标软件上线,将研发业务全面流程化,完全支 ...

  10. 与众不同 windows phone (10) - Push Notification(推送通知)之推送 Tile 通知, 推送自定义信息

    原文:与众不同 windows phone (10) - Push Notification(推送通知)之推送 Tile 通知, 推送自定义信息 [索引页][源码下载] 与众不同 windows ph ...