除了不能继承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枚举类型中加入新方法的更多相关文章

  1. Java 枚举类型简介

    目录 Java 枚举示例 Java 枚举构造函数 枚举类型是用于定义常量集合的特殊类型,更确切的说,JAVA枚举类型是一种特殊的 java 类.枚举类型可以包含常量.方法等.在 java5 中添加了 ...

  2. Python中模拟enum枚举类型的5种方法分享

    这篇文章主要介绍了Python中模拟enum枚举类型的5种方法分享,本文直接给出实现代码,需要的朋友可以参考下   以下几种方法来模拟enum:(感觉方法一简单实用) 复制代码代码如下: # way1 ...

  3. 【转】java枚举类型enum的使用

    原文网址:http://blog.csdn.net/wgw335363240/article/details/6359614 java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到 ...

  4. 【转】掌握java枚举类型(enum type)

    原文网址:http://iaiai.iteye.com/blog/1843553 1   背景 在java语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具有int常量.之前我们通常利用 ...

  5. 转载 java枚举类型enum的使用 (原文地址:http://blog.csdn.net/wgw335363240/article/details/6359614)

    java枚举类型enum的使用 最近跟同事讨论问题的时候,突然同事提到我们为什么java中定义的常量值不采用enmu枚举类型,而采用public final static 类型来定义呢?以前我们都是采 ...

  6. java枚举类型详解

      枚举类型是JDK1.5的新特性.显然,enum很像特殊的class,实际上enum声明定义的类型就是一个类.而这些类都是类库中Enum类的子类(java.lang.Enum<E>).它 ...

  7. Java枚举类型的用法

    JDK1.5引入了新的类型——枚举.在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便. 1.用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fia ...

  8. Java枚举类型的使用,数值的二进制表示

    一.Java枚举类型的使用 首先请看这段代码: package java上课; public class EnumTest { public static void main(String[] arg ...

  9. java 枚举类型分析

    最近做android开发,需要用到枚举值,这样可以连续赋值,我按之前c++那样书写,如下所示: public enum ColorSelect { RED_BAGE = 0, GREEN_BAGE, ...

随机推荐

  1. hdu2026(water~~)

    http://acm.hdu.edu.cn/showproblem.php?pid=2026 #include<iostream> #include<stdio.h> #inc ...

  2. Git系列学习(1)-Git安装

    一.概述 msysGit名字前面的四个字面来源于MSYS项目: MSYS项目来源于MinGW(Minimalist GNU for Windows,最简GNU工具集) 通过添加一个bash提供的she ...

  3. Raspberry Pi开发之旅-空气温湿度检测(DHT11)

    一.首先,简单介绍下DHT11: DHT11是一个温湿度传感器,分为3个接口,分别为:VCC, DATA, GND  引脚号 名称 类型 说明 1 VCC 电源 +级,输入3V-5.5V 2 DATA ...

  4. PHP基础知识测试题及解析

      本试题共40道选择题,10道判断题,考试时间1个半小时 一:选择题(单项选择,每题2分): 1. LAMP具体结构不包含下面哪种(A ) A:Windows系统 B:Apache服务器 C:MyS ...

  5. js获取某年某月一共多少天

    const getDaysInMonth = (year, month) => { let date = new Date(year, month, 1); return new Date(da ...

  6. html5——拖拽

    基本情况 在HTML5的规范中,我们可以通过为元素增加draggable="true"来设置此元素是否可以进行拖拽操作,其中图片.链接默认是开启的. 拖拽元素 页面中设置了drag ...

  7. C#——反射动态创建类的实例

    “反射”其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间. 若要反射当前项目中的类(即当前项目已经引用它了),可以使用下面的写法. ...

  8. 易买网之smartupload实现文件上传

    经过俩个星期的奋斗,易买网项目完工.在之前,实现图片的上传,走过许多弯路,原来是好多基础的知识忘记了,没把smartupload文件包添加组件jar包至WEB-INF/lib包中,在此特别重视,做下文 ...

  9. 【sqli-labs】 less51 GET -Error based -Order By Clause -String -Stacked injection(GET型基于错误的字符型Order By从句堆叠注入)

    less50的字符型版本,闭合好引号就行 http://192.168.136.128/sqli-labs-master/Less-51/?sort=1';insert into users(id,u ...

  10. C# 获得Properties下的定义的资源

    var str1 = Properties.Resources.ResourceManager.GetObject("String1", null); string url = S ...