Effective Java 第二版 Enum
/**
* Effective Java 第二版
* 第30条:用enum代替int常量
*/ import java.util.HashMap;
import java.util.Map; public class EnumTest { /*媒体操作*/
public final static int START = 1;
public final static int PAUSE = 2;
public final static int RESUME = 3;
public final static int STOP = 4; /*返回结果*/
public final static int RET_OK = 1; private static int playWithInt(int fun)
{
switch (fun)
{
case START:
case PAUSE:
case RESUME:
case STOP:
System.out.println("playWithInt do " + fun);
break;
default:
}
return RET_OK;
} public enum PlayEm
{
START,PAUSE,RESUME,STOP //命名空间使得他可以重名
} private static void playWithEnum(PlayEm fun)
{
switch (fun)
{
case START:
case PAUSE:
case RESUME:
case STOP:
System.out.println("playWithEnum do " + fun);
break;
default: }
} public enum SuperPlayEm
{
START(1,"START"),PAUSE(2,"PAUSE"),RESUME(3,"RESUME"),STOP(4,"STOP"); private final int code;
private final String name; SuperPlayEm(int code, String name) {
this.code = code;
this.name = name;
} @Override
public String toString() {
return "SuperPlayEm{" +
"code=" + code +
", name='" + name + '\'' +
'}';
} public void doPlay(String player)
{
switch (this)
{
case START:
case PAUSE:
case RESUME:
case STOP:
System.out.println("player : "+ player + " exec " + this.name());
break;
default:
} }
} private static void playWithSuperEnum(SuperPlayEm fun)
{
switch (fun)
{
case START:
case PAUSE:
case RESUME:
case STOP:
default:
System.out.println("playWithSuperEnum do " + fun);
}
} public enum SuperPlayApplyEm
{
START(1,"START"){void doPlay(String player){System.out.println("player : "+ player + " exec START" );}},
PAUSE(2,"PAUSE"){void doPlay(String player){System.out.println("player : "+ player + " exec PAUSE" );}},
RESUME(3,"RESUME"){void doPlay(String player){System.out.println("player : "+ player + " exec RESUME" );}},
STOP(4,"STOP"){void doPlay(String player){System.out.println("player : "+ player + " exec STOP" );}}; private final int code;
private final String name; SuperPlayApplyEm(int code, String name) {
this.code = code;
this.name = name;
} @Override
public String toString() {
return "SuperPlayEm{" +
"code=" + code +
", name='" + name + '\'' +
'}';
} abstract void doPlay(String player);
} public enum MixEnum
{
START("400100","1001"),
PAUSE("400100","1002"),
RESUME("400100","1003"),
STOP("400100","1004")
;
private final String baseCode;
private final String followCode; private static final Map<String,MixEnum> map = new HashMap<String,MixEnum>(); static {
for (MixEnum mixEnum : MixEnum.values()) {
map.put(mixEnum.baseCode+mixEnum.followCode,mixEnum);
}
} MixEnum(String baseCode, String followCode) {
this.baseCode = baseCode;
this.followCode = followCode; } public static MixEnum fromCode(String code)
{
return map.get(code);
}
} public static void main(String[] args) {
/*P128-P134*/
//传统C做法
playWithInt(START); //打印无法识别
playWithInt(RET_OK); //编译器不能报错 //普通java枚举
playWithEnum(PlayEm.START);
// playWithEnum(RET_OK); /**
* 自定义java枚举
*/
SuperPlayEm aaa = SuperPlayEm.START;
playWithSuperEnum(aaa); /**
* 打印所有枚举信息
* 如果有人要一份接口文档时,是不是会很好用
*/
for (SuperPlayEm superPlayEm : SuperPlayEm.values()) {
System.out.println(superPlayEm);
} /**
* 这个枚举可以做的很强大,给他设置很多参数,也可以定义函数
* 但这样做可能在加一个枚举的时候,忘记加case分支
*/
aaa.doPlay("camera");
/**
* 防止忘记加case
* 但这样导致代码变多,各有利弊吧。
*/
SuperPlayApplyEm superPlayApplyEm = SuperPlayApplyEm.PAUSE;
superPlayApplyEm.doPlay("camera"); /**
* 生成枚举的方法 1 valueOf
*/
SuperPlayEm superPlayEm = SuperPlayEm.valueOf("START");
System.out.println(superPlayEm); /**
* 生成枚举的方法 2 自定义
*
*/
MixEnum mixEnum = MixEnum.fromCode("4001001002");
System.out.println(mixEnum);
} }
Effective Java 第二版 Enum的更多相关文章
- 《Effective Java第二版》总结
第1条:考虑用静态工厂方法代替构造器 通常我们会使用 构造方法 来实例化一个对象,例如: // 对象定义 public class Student{ // 姓名 private String name ...
- 《Effective Java 第二版》读书笔记
想成为更优秀,更高效程序员,请阅读此书.总计78个条目,每个对应一个规则. 第二章 创建和销毁对象 一,考虑用静态工厂方法代替构造器 二, 遇到多个构造器参数时要考虑用builder模式 /** * ...
- 如何创建和销毁对象(Effective Java 第二章)
最近有在看Effective Java,特此记录下自己所体会到的东西,写篇博文会更加的加深印象,如有理解有误的地方,希望不吝赐教. 这章主题主要是介绍:何时以及如何创建对象,何时以及如何避免创建对象, ...
- 对于所有对象都通用方法的解读(Effective Java 第二章)
这篇博文主要介绍覆盖Object中的方法要注意的事项以及Comparable.compareTo()方法. 一.谨慎覆盖equals()方法 其实平时很少要用到覆盖equals方法的情况,没有什么特殊 ...
- [Effective Java]第二章 创建和销毁对象
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- effective java——30使用enum
1, 枚举太阳系八大行星 package com.enum30.www; public enum Planet {//枚举太阳系八大行星 MERCURY(3.302e+23,2.439e6), VEN ...
- Effective C++ 第二版 17)operator=检查自己 18)接口完整 19)成员和友元函数
条款17 在operator=中检查给自己赋值的情况 1 2 3 class X { ... }; X a; a = a; // a 赋值给自己 >赋值给自己make no sense, 但 ...
- Effective C++ 第二版 1)const和inline 2)iostream
条款1 尽量用const和inline而不用#define >"尽量用编译器而不用预处理" Ex. #define ASPECT_R 1.653 编译器永远不会看到AS ...
- Effective C++ 第二版 40)分层 41)继承和模板 42)私有继承
条款40 通过分层来体现"有一个"或"用...来实现" 使某个类的对象成为另一个类的数据成员, 实现将一个类构筑在另一个类之上, 这个过程称为 分层Layeri ...
随机推荐
- Java线程问题(基础回顾)
1.概念:线程是运行程序(进程)中单个顺序的小程序,一个进程可以由多个线程组成,而这多个线程共享同一个存储空间,这使得线程间的通信比较容易.在一个多进程的程序中,如果要切换到另一个进程,需要改变地址空 ...
- dll和so文件区别与构成
http://www.cnblogs.com/likwo/archive/2012/05/09/2492225.html 动态链接,在可执行文件装载时或运行时,由操作系统的装载程序加载库.大多数操作系 ...
- WPF实现无刷新动态切换多语言(国际化)
1. 在WPF中国际化使用的是 .xaml文件的格式 如图:Resource Dictionary (WPF) 2. 创建默认的语言文件和其他语言文件 这里以英语为默认语言,新建一个 Resource ...
- JNI注册调用完整过程-安卓4.4
在Android系统中,JNI方法是以C/C++语言来实现的,然后编译在一个so文件里面,以我之前的例子为例Android Studio使用JNI,调用之前要加载到当前应用程序的进程的地址空间中: s ...
- oracle 自动表分区
Oracle 新功能自动分区: 实现代码: create table t_interval partition by range(created)//dba_objects 视图的一个字段 inter ...
- Ajax发送GET、POST请求和响应XML数据案例
1.新建工程 新建一个java web工程,新建一个Servlet文件 AServlet.java,用于返回get和post请求. public class AServlet extends Http ...
- MySQL 8.0 压缩包版安装方法
转自:https://blog.csdn.net/yangs_2012/article/details/80412016 注意: 操作系统:Windows 10 专业版(64位) MySQL版本:my ...
- [Java反射基础四]通过反射了解集合泛型的本质
本文接上文"方法反射的基本操作",利用反射了解下java集合中泛型的本质 1.初始化两个集合,一个使用泛型,一个不使用 ArrayList list1 = new ArrayLis ...
- asp.net core 错误定位 & vs2017 远程调试部署在centos上的asp.net core程序
前言 程序运行中会出现各种BUG. 排除BUG有三种方式. 一.访问页面直接报错误信息 出于安全,服务器是关闭这个功能的.在centos上可以用 命令设置环境变量来解决: export A ...
- HTML学习笔记《二》 ----HTML部分标签应用
HTML 部分标签应用 一.HTML中的注释.标签语法以及颜色表示方式 1.HTML中注释: <!-- .... --> 注释的目的:1. 辅助说明 2.代码调试(不同编程语言,注释方式略 ...