枚舉

典型枚舉類型的定義

Color:數組

public enum Color{
    RED,BLUE,BLACK,YELLOW,GREEN
}

Color字節碼代碼: :fa-exclamation-circle:枚舉值都是public static final的,枚舉值最好所有大寫ide

final enum hr.test.Color {
    // 全部的枚舉值都是類靜態常量
    public static final enum hr.test.Color RED;
    public static final enum hr.test.Color BLUE;
    public static final enum hr.test.Color BLACK;
    public static final enum hr.test.Color YELLOW;
    public static final enum hr.test.Color GREEN;
    private static final synthetic hr.test.Color[] ENUM$VALUES;
}

特徵及用法

  • 枚舉類就是class類,並且是一個不能夠被繼承的final類
  • 即然枚舉類是class,固然在枚舉類型中有構造器,方法和數據域。 可是,枚舉類的構造器有很大的不一樣:
  1. 構造器只是在構造枚舉值的時候被調用
//構造枚舉值:RED(255, 0, 0)
Color color=Color.RED;
  1. 構造器只能私有private 枚舉類的方法和數據域能夠容許外部訪問
  2. 全部枚舉類都繼承了Enum的方法
1.ordinal()方法: 
    返回枚舉值在枚舉類種的順序。這個順序根據枚舉值聲明的順序而定,0開始遞增+1
2.compareTo()方法:
    返回的是兩個枚舉值的順序之差。(兩個枚舉值必須是同一枚舉類,不然ClassCastException)
3.values()方法: 
    靜態方法,返回一個包含所有枚舉值的數組。
    Color[] colors=Color.values();
  1. 枚舉類能夠在switch語句中使用

一種很好的枚舉示例

Encodable:爲code值變動提供接口this

Decoder:變換code值爲枚舉變量名code

FileType:枚舉類對象

直接上代碼:繼承

FileType :接口

public enum FileType implements Encodable < String > {

    /** 文件 */
    FILE( "0", "code.value.filetype.FILE" ),

    /** 文件夾 */
    FOLDER( "1", "code.value.filetype.FOLDER" ),
    ;

    //values():表示獲得所有的枚舉內容,而後以對象數組的形式用foreach輸出
    private static final Decoder < String, FileType > decoder = Decoder.create( values() );

    /** code值 */
    //0
    //1
    private final String                              code;

    /** 屬性文件的key值 */
    //code.value.filetype.FILE
    //code.value.filetype.FOLDER
    private final String                              propertyKey;

    private FileType( String code, String propertyKey ) {
        this.code = code;
        this.propertyKey = propertyKey;
    }

    @Override
    public String encode() {
        return code;
    }

    @Override
    public String propertyKey() {
        return propertyKey;
    }

    /**
     * 將指定的code變換爲對應的值{@link FileType}。
     *
     * @param code code
     * @return FileType的值不存在的時候返回null。
     */
    public static FileType decode( final String code ) {
        FileType type = decoder.decode( code );
        return type;
    }

    /**
     * 取得code對應的code名稱
     *
     * @param code code
     * @return code名稱
     */
    public static String getName( final String code ) {
        FileType type = decode( code );

        // ....可擴展
        return type.propertyKey();
    }
}

Encodable:ci

public interface Encodable < T extends Serializable > {

    /**
     * 取得code值
     *
     * @return code值
     */
    public T encode();

    /**
     * 取得屬性文件的key值
     *
     * @return 屬性文件的key值
     */
    public String propertyKey();
}

Decoder:get

public class Decoder < K extends Serializable, V extends Encodable < K >> {
    private final Map < K, V > map;

    /**
     * @param values 變換值list
     * @exception IllegalArgumentException code值重複
     */
    private Decoder( V[] values ) {
        map = new HashMap < K, V >( values.length );

        for ( V val : values ) {
            V old = map.put( val.encode(), val );
            // code值重複
            if ( old != null ) {
                throw new IllegalArgumentException( "重複的code: " + val );
            }
        }
    }

    /**
     * 變換code值
     *
     * @param code code值
     * @return 變換值
     */
    public V decode( K code ) {
        return map.get( code );
    }

    /**
     * class做成
     *
     * @param values 變換值list
     * @return Decoder Class
     */
    public static < K1 extends Serializable, V1 extends Encodable < K1 >> Decoder < K1, V1 > create( V1[] values ) {
        return new Decoder < K1, V1 >( values );
    }
}

FileType.FILE----------------: FILEit

FileType.FILE.encode()-------: 0

FileType.decode( "0" )-------: FILE

FileType.FILE.propertyKey()--: code.value.filetype.FILE

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息