`
kavy
  • 浏览: 890657 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java枚举

 
阅读更多

在一个Server/Client程序中,对Client端的每个请求,Server端返回的结果中均包含响应状态码和响应内容两部分。对于状态码的处理,以前的做法通常是用一系列public static final int常量来定义。调用者往往要写一些额外的代码对传入的状态码进行有效性检查。在Java 5以后,可以用枚举类型来处理,好处就不用细说了:接口直观,类型安全等。

一、使用枚举实现类型安全的接口

下面是使用枚举来实现的示意代码:
//OpStatus.java 定义状态码枚举类型
public enum OpStatus{
    S_OK,    //正常结果
     S_PROTOCOL,   //协议格式错误
     S_AUTH,    //用户名/密码错误
    S_ITEMEXISTED, //业务异常1,条目已存在
    S_SQL,    //数据库操作异常
    S_UNKNOWN;   //未知异常
}

//OpTest.java 状态码调用示例
public class OpTest{
    //这个方法中采用强类型的OpStatus,不要额外的检查代码
    public void writeResponse(OpStatus status, String content){
        System.out.println("[Status]"+status+"[Content]"+content);
    }

    public static void main(String[] args){
        OpTest test=new OpTest();
        test.writeResponse(OpStatus.S_OK,"good result");
        test.writeResponse(OpStatus.S_ITEMEXISTED,"item existed exception");
    }
}

运行上面的测试程序,发现输出的结果是:
[Status]S_OK......
[Status]S_ITEMEXISTED......
这并不是客户端想要的结果,客户端需要的是0,1,2之类的状态码数值。

二、枚举类型的toString()和ordinal()方法

查阅Java Document,原来枚举类型toString()的结果是枚举常量的名称,而不是序号。Java提供了另外一个方法来获取枚举常量的序号:
public final int ordinal();

因此我们需要覆盖toString()方法,让其返回序号值,下面是修改后的代码:
public enum OpStatus{
    S_OK,
    S_PROTOCOL,
    S_AUTH,
    S_ITEMEXISTED,
    S_SQL,
    S_UNKNOWN;

    @Override
    public String toString(){
        return String.valueOf(ordinal());
    }
}

再次运行上面的测试程序,发现输出了期望的结果:
[Status]0......
[Status]3......

三、定制枚举常量的序号

但是问题又来了,随着开发的进行,又增加了一个业务状态码S_ITEMNOTFOUND,它要插入到S_ITEMEXISTED之后,而且以后可能还会增加其他状态码。上面的从0~5的顺序序号已经不能满足需要,我们需要自由定义每个枚举常量的序号,比如,使S_SQL序号为15,S_UNKNOWN序号为16,以后增加的业务状态码序号在3~15之间。

在C语言中,定义枚举的同时可以为其指定序号。但是这在Java中是行不通的,修改OpStatus:
S_OK=0,
.......
S_SQL=15,
S_UNKNOWN=16;
不难发现,这样的修改将导致编译错误。

继续查阅文档发现,枚举和Java类很相似,可以定义变量和方法,包括构造方法。和类有点区别的是构造方法不能为public,以防止客户实例化。

下面是根据这种思路修改后的OpStatus,已经看起来和一个普通Java类差不多了。
public enum OpStatus{
    //枚举常量定义的同时指定状态码
    S_OK(0),
    S_PROTOCOL(1),
    S_AUTH(2),
    S_ITEMEXISTED(3),
    S_ITEMNOTFOUND(4),
    S_SQL(15),
    S_UNKNOWN(16);

    private int code; //状态码值

    OpStatus(int code){ //非public构造方法
        this.code=code;
    }

     @Override
    public String toString(){
        return String.valueOf(code);
    }
}

转自:http://blog.csdn.net/ericxyy/article/details/1911012

分享到:
评论

相关推荐

    java枚举实例代码

    Java枚举(enum)是Java语言中的一种特殊数据类型,用于定义一组有限的常量,这些常量在程序中作为固定的值使用。枚举在Java中被引入,目的是为了更好地管理和使用常量,提高代码的可读性和安全性。在本实例代码中,...

    Java枚举类型Enum的用法

    Java枚举类型(Enum)是Java SE 5.0引入的一种新的数据类型,它为开发者提供了更为强大且安全的方式来表示一组常量。枚举在Java中不仅是一个类,还是一种特殊的类型,允许我们定义自己的常量集合。接下来,我们将...

    java枚举类型说明

    ### Java枚举类型详解 #### 一、引言 在Java编程语言中,枚举(Enum)作为一种重要的数据类型,在程序设计中扮演着不可或缺的角色。本文将深入探讨Java枚举类型的特性和用法,并通过具体实例说明其优势所在。枚举...

    简单总结java枚举类型

    Java枚举类型是Java语言中一种特殊的类,用于定义固定的常量集合,它提供了一种安全、类型化的方式来表示一组有限的值。枚举在Java中被引入为一个完整的类型,不同于C++中的枚举,这使得Java枚举更加强大且易于使用...

    java枚举状态机

    Java枚举(Enum)状态机是一种使用枚举类型来实现状态转换逻辑的编程技术,它在Java编程中被广泛应用于管理对象的状态变化。状态机是一种模型,用于描述一个系统或对象在不同时间点可能存在的状态以及如何从一个状态...

    java枚举结果类、根据状态值获取枚举值

    java枚举结果类、根据状态值获取枚举值 Controller: /** 模块类型枚举 */ model.addAttribute("mType", ModuleTypeEnum.ModuleTypeShow()); ftl: value="${mType.key}:${mType.value}” </#list>

    java枚举类用法

    Java枚举类型(enum)是Java语言中一种特殊的类,用于定义一组固定的常量。它在许多场景下作为替代常量或单例模式的选择,提供了更安全、更易读的代码。下面我们将深入探讨Java枚举类的用法及其优势。 1. **枚举的...

    高阶Java-Java枚举类型 enum 应用详解

    本篇文章将深入探讨Java枚举的特性、用法以及如何在实际开发中充分利用它们。 一、枚举的基本用法 1. 声明枚举类型: ```java public enum Color { RED, GREEN, BLUE } ``` 在这里,`Color`是枚举类型,`RED`, `...

    理解java枚举类型

    Java枚举类型是Java语言中的一种特殊的类,用于定义一组固定的常量集合。它在Java中扮演着重要的角色,提供了一种安全、类型化的常量表示方式,比传统的final static变量更具有优势。理解Java枚举类型对于编写高质量...

    列举java 枚举相关信息

    ### Java 枚举类型详解 #### 一、引言 ...通过以上的介绍,我们可以看到Java枚举类型不仅提供了类型安全的保障,还为开发者带来了极大的灵活性。合理地使用枚举类型,可以显著提高代码的质量和可维护性。

    Java枚举类型.pdf

    在本文中,我们将深入探讨Java枚举的定义、使用方法以及它如何改善传统使用`static final`常量的模式。 首先,让我们看看传统的`static final`常量表示枚举的方式。例如,清单1展示了如何使用`public static final`...

    java枚举的一个实例

    Java枚举是编程语言Java中的一个特色特性,它在类、接口和变量的定义中扮演着特殊的角色。枚举在Java中被用作一种数据类型,用于定义一组固定的常量,这些常量可以代表特定的值或状态。通过枚举,我们可以确保变量...

    如何使用Java枚举类型

    一个关于JAVA枚举类型的MHT文件,包含JAVA枚举类型的用法,以及JDK版本的问题。

    java枚举ppt和详细代码

    Java枚举是面向对象编程中的一个重要特性,它用于定义固定的常量集合,这些常量通常代表某种特定的数据类型。在Java中,枚举提供了一种更安全、更规范的方式来处理常量,相比于传统的final static变量,枚举具有更多...

    Java枚举与设计模式

    本文详尽地论述了Java枚举与设计模式的关系

    java枚举,以及自己总结的两个示例.xmind

    如有侵权请联系删除,欢迎批评指正 java枚举,起初在网上抄了一部分,然后自己加了点示例,做一个记录,也算是为以后留个备份,技术小白一个,还在努力成长

    java枚举类的属性、方法和构造方法应用实战

    Java 枚举类的属性、方法和构造方法应用实战 Java 枚举类是一种特殊的类,它拥有自己的属性、方法和构造方法。本文将详细介绍 Java 枚举类的属性、方法和构造方法应用实战,结合实例形式分析了 Java 枚举类的定义、...

    JAVA枚举类型的用法详解

    下面我们将深入探讨Java枚举类型的常见用法。 首先,枚举类型在本质上等同于定义了一组静态常量。创建枚举类型的语法如下: ```java public enum Belle { para1, para2, para3, para4; } ``` 这会创建一个名为`...

    深入理解 Java 枚举(枚举的方法+枚举的特性+枚举可以实现接口+组织枚举+策略枚举+枚举工具类等)

    深入理解 Java 枚举 Java 枚举是 Java 语言中的一种特殊类型,自 JDK 5 开始引入,使用 enum 关键字修饰。在 Java 中,枚举是一种受限制的类,具有自己的方法。枚举的本质是 java.lang.Enum 的子类,它提供了一些...

    全面掌握java枚举类型(enum-type)1

    全面掌握 Java 枚举类型(enum type) Java 枚举类型是一种特殊的数据类型,它可以取有限个数的明确值。枚举类型的引入解决了 int 枚举模式和 String 枚举模式的缺点,提供了类型安全性、可读性和性能等优势。 ...

Global site tag (gtag.js) - Google Analytics