向Java枚举类型中加入新方法
除了不能继承enum之外,可将其看做一个常规类。甚至能够有main方法。
注意:必须先定义enum实例。实例的最后有一个分号。
以下是一个样例:返回对实例自身的描写叙述,而非默认的toString返回枚举实例的名字。
public enum Color {
RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
// 成员变量
private String name;
private int index; // 构造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
} public static String getName(int index) {
//利用了枚举自身的values()方法;
for (Color c : Color.values()) {
if (c.getIndex() == index) {
return c.name;
}
}
return null;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}
重要性在于:能够调用对应枚举成员的方法来生成对应的对象,比方以下的OFType,能够这样使用:
OFType t = OFType.HELLO;
t.newInstance();
以下是Floodlight controller中相关知识点的体现
public enum OFType {
//这里自己定义构造方法。有三个參数
HELLO (0, OFHello.class, new Instantiable<OFMessage>() {
@Override
public OFMessage instantiate() {
return new OFHello();
}}),
ERROR (1, OFError.class, new Instantiable<OFMessage>() {
@Override
public OFMessage instantiate() {
return new OFError();
}}), PACKET_IN (10, OFPacketIn.class, new Instantiable<OFMessage>() {
@Override
public OFMessage instantiate() {
return new OFPacketIn();
}}), PACKET_OUT (13, OFPacketOut.class, new Instantiable<OFMessage>() {
@Override
public OFMessage instantiate() {
return new OFPacketOut();
}}),
FLOW_MOD (14, OFFlowMod.class, new Instantiable<OFMessage>() {
@Override
public OFMessage instantiate() {
return new OFFlowMod();
}}); static OFType[] mapping; //每一个消息类型,都须要相应的详细实现类
protected Class<? extends OFMessage> clazz; //每一个消息类的无參构造器
protected Constructor<? extends OFMessage> constructor; //接口 Instantiable 有一个初始化实例的方法。创建详细的OFMessage
protected Instantiable<OFMessage> instantiable; //消息类型的值
protected byte type; /**构造方法
* Store some information about the OpenFlow type, including wire protocol
* type number, length, and derived class
*
* @param type Wire protocol number associated with this OFType
* @param requestClass The Java class corresponding to this type of OpenFlow message
* @param instantiator An Instantiator<OFMessage> implementation that creates an
* instance of the specified OFMessage
*/
OFType(int type, Class<? extends OFMessage> clazz, Instantiable<OFMessage> instantiator) {
this.type = (byte) type;
this.clazz = clazz;
this.instantiable = instantiator;
try {
this.constructor = clazz.getConstructor(new Class[]{});
} catch (Exception e) {
throw new RuntimeException("Failure getting constructor for class: " + clazz, e);
}
OFType.addMapping(this.type, this); //值到枚举类的映射
} /**
* Adds a mapping from type value to OFType enum
*
* @param i OpenFlow wire protocol type
* @param t type
*/
static public void addMapping(byte i, OFType t) {
if (mapping == null)
mapping = new OFType[32];
OFType.mapping[i] = t;
} /**
* Remove a mapping from type value to OFType enum
*
* @param i OpenFlow wire protocol type
*/
static public void removeMapping(byte i) {
OFType.mapping[i] = null;
} /**
* Given a wire protocol OpenFlow type number, return the OFType associated
* with it
*
* @param i wire protocol number
* @return OFType enum type
*/ static public OFType valueOf(Byte i) {
return OFType.mapping[i];
} /**
* @return Returns the wire protocol value corresponding to this OFType
*/
public byte getTypeValue() {
return this.type;
} /**
* @return return the OFMessage subclass corresponding to this OFType
*/
public Class<? extends OFMessage> toClass() {
return clazz;
} /**
* Returns the no-argument Constructor of the implementation class for
* this OFType
* @return the constructor
*/
public Constructor<? extends OFMessage> getConstructor() {
return constructor;
} /**
* Returns a new instance of the OFMessage represented by this OFType
* @return the new object
*/
public OFMessage newInstance() {
return instantiable.instantiate();
} /**
* @return the instantiable
*/
public Instantiable<OFMessage> getInstantiable() {
return instantiable;
} /**
* @param instantiable the instantiable to set
*/
public void setInstantiable(Instantiable<OFMessage> instantiable) {
this.instantiable = instantiable;
}
}
:
向Java枚举类型中加入新方法的更多相关文章
- Java 枚举类型简介
目录 Java 枚举示例 Java 枚举构造函数 枚举类型是用于定义常量集合的特殊类型,更确切的说,JAVA枚举类型是一种特殊的 java 类.枚举类型可以包含常量.方法等.在 java5 中添加了 ...
- Python中模拟enum枚举类型的5种方法分享
这篇文章主要介绍了Python中模拟enum枚举类型的5种方法分享,本文直接给出实现代码,需要的朋友可以参考下 以下几种方法来模拟enum:(感觉方法一简单实用) 复制代码代码如下: # way1 ...
- 【转】java枚举类型enum的使用
原文网址:http://blog.csdn.net/wgw335363240/article/details/6359614 java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到 ...
- 【转】掌握java枚举类型(enum type)
原文网址:http://iaiai.iteye.com/blog/1843553 1 背景 在java语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具有int常量.之前我们通常利用 ...
- 转载 java枚举类型enum的使用 (原文地址:http://blog.csdn.net/wgw335363240/article/details/6359614)
java枚举类型enum的使用 最近跟同事讨论问题的时候,突然同事提到我们为什么java中定义的常量值不采用enmu枚举类型,而采用public final static 类型来定义呢?以前我们都是采 ...
- java枚举类型详解
枚举类型是JDK1.5的新特性.显然,enum很像特殊的class,实际上enum声明定义的类型就是一个类.而这些类都是类库中Enum类的子类(java.lang.Enum<E>).它 ...
- Java枚举类型的用法
JDK1.5引入了新的类型——枚举.在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便. 1.用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fia ...
- Java枚举类型的使用,数值的二进制表示
一.Java枚举类型的使用 首先请看这段代码: package java上课; public class EnumTest { public static void main(String[] arg ...
- java 枚举类型分析
最近做android开发,需要用到枚举值,这样可以连续赋值,我按之前c++那样书写,如下所示: public enum ColorSelect { RED_BAGE = 0, GREEN_BAGE, ...
随机推荐
- 【BZOJ3294/洛谷3158】[CQOI2011]放棋子(组合数+DP)
题目: 洛谷3158 分析: 某OIer兔崽子的此题代码中的三个函数名:dfs.ddfs.dddfs(充满毒瘤的气息 显然,行与行之间.列与列之间是互相独立的.考虑背包,用\(f[k][i][j]\) ...
- [转]linux grep命令
转自:http://www.cnblogs.com/end/archive/2012/02/21/2360965.html 1.作用Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表 ...
- 加密解密Url字符串,C#对Url进行处理,传递Url
string _QueryStringKey = "abcdefgh"; //URL传输参数加密Key /// 加密URL传输的字符串 public string E ...
- Spring Cloud (9) 服务容错保护-Hystrix断路器
断路器 断路器本身是一种开关装置,用于在电路上保护线路过载,当线路中又电路发生短路时,断路器能够及时的切断故障电路,放置发生过载.发热.甚至起火等严重后果. 在分布式架构中,断路器模式的作用也是类似, ...
- AdminLTE介绍和zTree的简单使用
一.AdminLTE介绍 1.介绍 AdminLTE是一个开源的后台控制面板和仪表盘 WebApp 模板,是建立在Bootstrap3框架和JQuery之上的开源模板主题工具,它提供了一系列响应的 ...
- Laravel5.1学习笔记18 数据库4 数据填充
简介 编写数据填充类 使用模型工厂类 调用额外填充类 执行填充 #简介 Laravel includes a simple method of seeding your database with t ...
- 移动web——bootstrap栅格系统
基本简介 1.Bootstrap 提供了一套响应式.移动设备优先的流式栅格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列 2.栅格系统用于通过一系列的行(row)与列(c ...
- JS——锚点的运用
锚点的两种形式: 1.<a href="#a">点击到锚点</a> 2.window.location.hash = "#a"; 最后都 ...
- vue里的tab控件
如下图,v-model绑定的值,这个值在js里一旦改变,视图就会切换到相应的tab页,这意味着一定要先给tab页内容数据赋值,再改变这个tabsIndex的值 如下图,先赋值data列表数据,在更改t ...
- 扩增子分析QIIME2-4分析实战Moving Pictures
本示例的的数据来自文章<Moving pictures of the human microbiome>,Genome Biology 2011,取样来自两个人身体四个部位五个时间点 ...