Java 5 枚举

 在网上找到一遍介绍很详细的博客,在此转载.

 来源:小武的轨迹


 DK1.5引入了新的类型——枚举。在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便。


 用法一:常量


 在JDK1.5 之前,我们定义常量都是: public static fianl…. 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。

public enum Color {  
  RED, GREEN, BLANK, YELLOW  
}


 用法二:switch


  JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强。

enum Signal {  
    GREEN, YELLOW, RED  
}  
public class TrafficLight {  
    Signal color = Signal.RED;  
    public void change() {  
        switch (color) {  
        case RED:  
            color = Signal.GREEN;  
            break;  
        case YELLOW:  
            color = Signal.RED;  
            break;  
        case GREEN:  
            color = Signal.YELLOW;  
            break;  
        }  
    }  
}


    用法三:向枚举中添加新方法


    如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum 实例。

 

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) {  
        for (Color c : Color.values()) {  
            if (c.getIndex() == index) {  
                return c.name;  
            }  
        }  
        return null;  
    }  
    // get set 方法  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
    public int getIndex() {  
        return index;  
    }  
    public void setIndex(int index) {  
        this.index = index;  
    }  
}


 

  用法四:覆盖枚举的方法


   下面给出一个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;  
    }  
    //覆盖方法  
    @Override
    public String toString() {  
        return this.index+"_"+this.name;  
    }  
}

   用法五:实现接口


   所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。


public interface Behaviour {  
    void print();  
    String getInfo();  
}  
public enum Color implements Behaviour{  
    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;  
    }  
    //接口方法  
    @Override
    public String getInfo() {  
        return this.name;  
    }  
    //接口方法  
    @Override
    public void print() {  
        System.out.println(this.index+":"+this.name);  
    }  
}

 

   用法六:使用接口组织枚举

 

public interface Food {  
    enum Coffee implements Food{  
        BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO  
    }  
    enum Dessert implements Food{  
        FRUIT, CAKE, GELATO  
    }  
}


  用法七:关于枚举集合的使用


 java.util.EnumSetjava.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的key是enum类型,而value则可以是任意类型。关于这个两个集合的使用就不在这里赘述,可以参考JDK文档。



  自己曾在项目中这样使用Enum的.https://github.com/hubs/JZero/blob/master/src/com/jzero/util/MEnum.java


/**
 * --- 2011-10-25 ---
 * --- Administrator ---
 * MyEnum.java : 所有操作类型
 */
package com.jzero.util;
 
public enum MEnum {
    LT("<"), GT(">"), EQ("="), LT_E("<="), GT_E(">="), LIKE("LIKE"), OR("OR"), NOT(
            "NOT"), IN("IN"), NOT_IN("NOT_IN"), BETWEEN("BETWEEN"), AND("AND"),NOT_EQ(" !=");
 
    private final String value;
 
    private MEnum(String value) {
        this.value = value;
    }
 
    public String getValue() {
        return value;
    }
 
    public static String get(MEnum e) {
        String str = null;
        switch (e) {
        case LT:
            str = MEnum.LT.getValue();
            break;
        case GT:
            str = MEnum.GT.getValue();
            break;
        case EQ:
            str = MEnum.EQ.getValue();
            break;
        case LT_E:
            str = MEnum.LT_E.getValue();
            break;
        case GT_E:
            str = MEnum.GT_E.getValue();
            break;
        case LIKE:
            str = MEnum.LIKE.getValue();
            break;
        case NOT:
            str = MEnum.NOT.getValue();
            break;
        case IN:
            str = MEnum.IN.getValue();
            break;
        case NOT_IN:
            str = MEnum.NOT_IN.getValue();
            break;
        case BETWEEN:
            str = MEnum.BETWEEN.getValue();
            break;
        case OR:
            str = MEnum.OR.getValue();
            break;
        case AND:
            str = MEnum.AND.getValue();
            break;
        case NOT_EQ:
            str=MEnum.NOT_EQ.getValue();
            break;
        }
        return str;
    }
 
}


MCnt.java类


/**
 * --- 2011-10-25 ---
 * --- Administrator ---
 * MyCnt.java : 主要用于生成where语句
 */
package com.jzero.util;
    
public final class MCnt {
    
    private static StringBuffer sb = new StringBuffer();
    private static MCnt cnt=new MCnt();
    public MCnt() {
        sb.setLength(0);//清除
    }
    
    public static MCnt me(){
        return cnt;
    }
    
    public void clear() {
        sb.delete(0, sb.length());
    }
    
    /**
     * 第一次 拼装成 key=value 或者 key>=value这种格式 AND
     */
    public MCnt first(String key, MEnum symbols, Object value) {
        if (symbols.getValue().equals("LIKE")) {
            value = "%" + value + "%";
        }
        sb.append(" ").append(key).append(" ").append(MEnum.get(symbols))
                .append(" '").append(value).append("' ");
        return this;
    }
    public MCnt first_eq(String key,Object value){
        return first(key,MEnum.EQ,value);
    }
    
    public MCnt in(String key,Object value){
        if(sb==null){
            sb = new StringBuffer();
        }
        sb.append(" ").append(key).append(" ").append(MEnum.IN).append(" ( ").append(value).append(" )");
        return this;
    }
    
    public MCnt like(String key, Object value) {
        sb.append(" AND ").append(key).append(" LIKE '%").append(value).append(
                "%' ");
        return this;
    }
    
    /**
     *除了第一次,在每次的前面加上 and 语句
     */
    public MCnt and(String key, MEnum symbols, Object value) {
        sb.append(" AND ").append(key).append(" ").append(MEnum.get(symbols))
                .append(" '").append(value).append("' ");
        return this;
    }
    public MCnt and_eq(String key,Object value){
        return and(key, MEnum.EQ, value);
    }
    
    public MCnt or(String key, MEnum symbols, Object value) {
        sb.append(" OR ").append(key).append(" ").append(MEnum.get(symbols))
                .append(" '").append(value).append("' ");
        return this;
    }
    /**
     * 解析成 select * from xx where 1=1 and x1=x and (x2=x or x3=x)
     */
    public MCnt and_in(final MCnt mCnt){
        sb.append(" AND (").append(mCnt.toStr()).append(")");
        return this;
    }
    public MCnt or_in(final MCnt mCnt){
        sb.append(" OR (").append(mCnt.toStr()).append(" ) ");
        return this;
    }
    public static void main(String[] args) {
        String where=MCnt.me().and_eq("1", 1).or_in(MCnt.me().first_eq("one", 1).or_eq("two", 1)).toStr();
        MPrint.print(where);
    }
    public MCnt or_eq(String key,Object value){
        return or(key, MEnum.EQ, value);
    }
    
    /**
     *除了第一次,在每次的前面加上 and 语句
     */
    public MCnt set(String key, MEnum symbols, Object value) {
        sb.append(" , ").append(key).append(" ").append(MEnum.get(symbols))
        .append(" '").append(value).append("' ");
        return this;
    }
    public MCnt first_set_eq(String key,  Object value) {
        sb.append(" , ").append(key).append(" ").append(MEnum.EQ).append(value);
        return this;
    }
    /**
     * 2011-11-5,用于between
     */
    public MCnt between(String key, String begin, String end) {
        sb.append(" ").append(key).append(" ").append(MEnum.get(MEnum.BETWEEN))
                .append(" '").append(begin).append("' ").append(
                        MEnum.get(MEnum.AND)).append(" '").append(end).append(
                        "' ");
        return this;
    }
    
    /**
     *2011-11-11 NOT BETWEEN;
     */
    public MCnt not_between(String key, String begin, String end) {
        sb.append(" ").append(key).append(" ").append(MEnum.get(MEnum.NOT))
                .append(" ").append(MEnum.get(MEnum.BETWEEN)).append(" '")
                .append(begin).append("' ").append(MEnum.get(MEnum.AND))
                .append(" '").append(end).append("' ");
        return this;
    }
    
    public String toStr() {
        String toSb = sb.toString();
        clear();
        return toSb;
    }
    
    @Override
    public String toString() {
        String toSb = sb.toString();
        clear();
        return toSb;
    }
    
}



使用方法
     
    public void del(){
        String filename=MURI.me().seg_str(3)+".sql";
        String where=MCnt.me().first("name", MEnum.EQ, filename).toStr();
        M.me().delete(MMsg.XT_BFB, where);
        String filePath=MTool.back_path()+filename;
        File file=new File(filePath);
        file.delete();
        MCommHelp.outHTML("xitong/beifen/index", Msg.DELETE_SUCCESS);
    }