`
fantaxy025025
  • 浏览: 1249925 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

状态常量爆炸-掌握java枚举类型(enum type)-代码一个也没有少

 
阅读更多

状态常量爆炸-java枚举类型(enum type)-代码一个也没有少

 

最近程序的状态常量太多了,而且跨平台跨语言的多个项目,导致状态常量值到处都是。雷,迟早得炸了。

 

实际使用还是有问题

 

状态值,在Java项目里,很多这么搞:

    public static final int BOOK_STATUS_NOT_AUDIT = 0;
    public static final int BOOK_STATUS_AUDITING = 1;
    public static final int BOOK_STATUS_PASS_AUDIT = 2;

    private static Map<Integer, String> bookStatusDescMap = new HashMap<Integer, String>();
    static {
        bookStatusDescMap.put(BOOK_STATUS_NOT_AUDIT, "未审核");
        bookStatusDescMap.put(BOOK_STATUS_AUDITING, "审核中");
        bookStatusDescMap.put(BOOK_STATUS_PASS_AUDIT, "已通过");
    }

    /**
     * Get description of book status
     * @param bookStatus
     * @return
     */
    public static String getBookStatusDesc(int bookStatus){
        return bookStatusDescMap.get(bookStatus);
    }

 

这种状态值太多的,与语言没有关系。

ruby程序里也一样:

  D_ATTRIBUTES_REBATE_FREE = 1
  D_ATTRIBUTES_XXX = 2
  D_ATTRIBUTES_MIDAUTUMN = 3
  Status_Invalid = 0
  Status_Valid = 1
  Status_Deleted = 2

  

java中,求助java的枚举,仍然有的问题:

多语言沟通的话,基本这些状态都是字符串和数字,而一般不会直接给出一个java枚举常量来。web开发中,和浏览器的请求打交道,也就只能得到字符串和数字了。

这时就会有个问题,根据一个数字,怎么知道java程序里面,对应哪个枚举常量。

之后才能根据此枚举常量,调用其方法,得到其描述等信息。

封装一下处理方法:

 

    public static String getSeasonDesc(int seasonCode){
        return getSeason(seasonCode).getDesc();
    }

    public static Season getSeason(int seasonCode){
        for (Season season : Season.values()) {
            if(season.getCode() == seasonCode){
                return season;
            }
        }
        return Season.SPRING;
    }
 

 

这么下来以后,从直观性,易读性,沟通性(得让那些不懂java的同学知道很容易知道我的状态设置情况并容易copy一段代码),来看,还不如直接用最“原始”的办法。

 

所以,最终我还是选择用“最原始”的方式。

 

Java枚举中的一些细节,下面那篇文章也讲到了,但有一些细节,再补充一下。

# 代码一个也没有少

  只不过是封装了一下,在java中使得编译器不能识别 magic-number 了。

# 枚举中的ordinal()方法

public final int ordinal()

Returns the ordinal of this enumeration constant (its position in its enum declaration, where the initial constant is assigned an ordinal of zero). Most programmers will have no use for this method. It is designed for use by sophisticated enum-based data structures, such as java.util.EnumSet and java.util.EnumMap.

这个是final方法的,给java系统自己用的,不能改,不该用。

# 枚举的常量,最后居然可以不用分号结尾! 

# 枚举常量即构造函数 

 

其他使用情况可以参考: http://blog.csdn.net/congqingbin/article/details/7520137

本文参考阅读:http://free9277.iteye.com/blog/1842880

 

+、+

===

----

+。+

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics