JDK新特性------枚举

枚举优点

如果要求实例化有限个Color对象,可以采用之前学过的多例模式,将构造私有化,在类里实例化对象,然后用静态get方法获取对象,代码如下:

package CODE.Java新特性;

class Color
{
    private String colour;
    public static final int RED_FLAG=1; //需要定义为static final ,否则在静态get方法的case里无法使用
    public static final int GREEN_FLAG=3;
    public static final int BLUE_FLAG=5;
    private static final Color Red=new Color("red");
    private static final Color Green=new Color("green");
    private static final Color Blue=new Color("blue");
    private Color(String colour)
    {
        this.colour=colour;
    }
    public static Color getColor(int flag)
    {
        switch(flag)
        {
            case RED_FLAG:
                return Red;
            case  GREEN_FLAG:
                return Green;
            case BLUE_FLAG:
                return Blue;
                default:
                    return null;
        }
    }
    public String toString()
    {
        return this.colour;
    }

}
public class Enum1
{
    public static void main(String[] args)
    {
        Color color=Color.getColor(Color.RED_FLAG);
        System.out.println(color);  //red
    }
}

可以看出用多例模式实例化对象有点麻烦,其实多例模式不实用,在JDK1.5引入枚举,枚举取代了多例模式,对上面例子用枚举代码如下:

enum Color  //Color是一个枚举类
{
    RED,  //枚举对象
    GREEN,
    BLUE
}
public class Enum1
{
    public static void main(String[] args)
    {
        System.out.println(Color.BLUE);  //是对象,而不是对象地址,覆写了toString
    }
}

使用enum关键字的枚举结构实际上是默认继承了Enum类的枚举类。即枚举实际上是个类。枚举默认是多例模式。

Enum类:

Enum类(抽象类)中有2大属性:
name :枚举对象名称
ordinal:枚举对象数字下标

public final int  ordinal ( ) :    取得枚举对象下标

public final String name( )  :  取得枚举对象名称

既然enum定义的枚举类继承了Enum类,那么Enum类的name( )和ordinal( )方法枚举类都可以使用:

enum Color  //Color是一个枚举类
{
    RED,  //枚举对象
    GREEN,
    BLUE
}
public class Enum1
{
    public static void main(String[] args)
    {
        Color color=Color.GREEN;
        System.out.println("对象:"+color.name()+ " 下标:"+color.ordinal()); //对象:GREEN 下标:1
    }
}

取得所有枚举类对象:

枚举类.values( );  //实际上是数组  并且覆写了 toString
比如Color.values();

例子:

enum Color  //Color是一个枚举类
{
    RED,  //枚举对象
    GREEN,
    BLUE
}
public class Enum1
{
    public static void main(String[] args)
    {
       for(Color tmp:Color.values())  //取得所有的枚举对象
       {
           System.out.println(tmp); //RED GREEN BLUE 覆写了toString
       }
    }
}

面试:enum与Enum区别:

  • enum是一个关键字,Enum是一个抽象类
  • enum定义的枚举类继承了Eunm类

枚举中定其他结构:

  • 枚举中若定义构造方法,构造方法必须使用private封装(枚举类是多例类,枚举类外部无法产生对象)
  • 枚举中若定义其他结构,枚举类对象声明必须放在首行。
////枚举中定义其他结构
enum Color  //Color是一个枚举类
{
    RED("red"), GREEN("green"), BLUE("blue"); //枚举类对象声明放首行
    private  String clour;
    private Color(String clour)  //构造私有化
    {
        this.clour=clour;
    }
    public String toString()
    {
        return this.clour;
    }
}
public class Enum1
{
    public static void main(String[] args)
    {
        Color color=Color.GREEN;
        System.out.println(color);  //green,如果没有在枚举类覆写,输出的是Enum覆写的oString 为GREEN
    }
}

枚举类实现接口:

////枚举类实现接口
interface IColor  //接口
{
    String func();  //抽象方法
}
enum Color  implements  IColor//枚举类实现接口
{
    RED("red"), GREEN("green"), BLUE("blue"); //枚举对象
    private  String clour;
    private Color(String clour)  //构造私有化
    {
        this.clour=clour;
    }
    public String func()  //覆写抽象方法
    {
        return this.clour;
    }
}
public class Enum1
{
    public static void main(String[] args)
    {
        IColor ic=Color.BLUE;  //枚举类实现了接口后,每个枚举对象变为接口对象
        System.out.println(ic.func());  //blue
    }
}

当枚举类实现接口后,枚举中的对象自动变为接口对象。

switch支持枚举

////switch支持枚举
enum Sex
{
    MALE,FEMALE
}
public class Enum1
{
    public static void main(String[] args)
    {
        switch(Sex.MALE)  //switch支持枚举对象,但是用处不大,因为已经知道对象
        {
            case FEMALE:
                System.out.println("beautiful");
                break;
            case MALE:
                System.out.println("handsome");
        }
    }
}

注:尽管switch支持枚举,但是用处不大。

枚举应用:
枚举里面声明了有限个对象,对一些类的实例化对象是有限个可以考虑枚举,比如性别,生肖等。

enum Sex
{
    MALE,FEMALE
}
class Person
{
    private String name;
    private Sex sex;  //注意是枚举对象,类型是枚举类
    public Person(String name,Sex sex)
    {
        this.name=name;
        this.sex=sex;
    }
}

public class Enum1
{
    public static void main(String[] args)
    {
       Person p=new Person("pick",Sex.MALE);
    }
}

猜你喜欢

转载自blog.csdn.net/sophia__yu/article/details/83824282