JavaSE——新特性概述

1.枚举

1.1.枚举问题引出

要讲枚举,首先要回顾多例设计模式,多例设计模式如下:构造方法私有化,类内部需要提供若干个实例化对象,后面通过static方法返回,示例如下:

class Color {
   private String title;
   public static final int RED_FLAG = 1;
   public static final int GREEN_FLAG = 2;
   public static final int BLUE_FLAG = 3;
   private static final Color RED = new Color("RED");
   private static final Color GREEN = new Color("GREEN");
   private static final Color BLUE = new Color("BLUE");
   public Color(String title) {
       this.title = title;
   }
   public static Color getInstance(int ch) {
       switch(ch){
           case RED_FLAG:
               return RED;
           case GREEN_FLAG:
               return GREEN;
           case BLUE_FLAG:
               return BLUE;
           default:
               return null;
       }
   }
   @Override
   public String toString() {
       return this.title;
   }
}

public class Test {
   public static void main(String[] args) {
       System.out.println(Color.getInstance(Color.BLUE_FLAG ));
   }
}
//BLUE

以上做法是是在JDK1.5以前的做法,这样做的目的是限制本类实例化对象产生的个数,但是从1.5开始有了枚举,以上代码可以用枚举来取代,示例代码如下:

enum Color {
   RED,BLUE,GREEN
}

public class Test {
   public static void main(String[] args) {
       System.out.println(Color.BLUE);
   }
}
//BLUE

实际上枚举就是一种高级的多例设计模式

1.2.Enum类

虽然JDK1.5提供了enumeration关键字,但是enum并不是一种新的结构,相反,它只是一种对类型的封装:使用enum关键字定义的枚举类型本质上相当于一个Class定义的类,继承了java.lang.Enum父类,在Enum类中有以下的方法:

  • 构造方法
protected Enum(String name, int ordinal)
  • 取得枚举姓名
public final String name()
  • 取得枚举序号
public final int ordinal()

上述方法的使用示例代码如下:

enum Color {
    RED,BLUE,GREEN
}

public class Test {
    public static void main(String[] args) {
        System.out.println(Color.BLUE.ordinal() + "=" + Color.BLUE.name());
    }
}
//1=BLUE

通过上述代码可以发现,枚举类默认继承Enum类。在枚举中还有一个方法可以取得所有枚举数据values(),返回值是一个枚举的对象数组,取得所有枚举数据示例代码如下:

enum Color {
    RED,BLUE,GREEN
}

public class Test {
    public static void main(String[] args) {
        for (Color temp:Color.values()) {
            System.out.println(temp.ordinal() + "=" + temp.name());
        }
    }
}
//0=RED
//1=BLUE
//2=GREEN

!!!请解释enum和Enum的区别?
enum是一个关键字,使用enum定义的枚举实际上就相当于一个类继承了Enum这个抽象类而已。

1.3.枚举中定义其他内容

虽然枚举等同于多例设计,但是多例设计是在一个类中产生的,所有该类中可以定义更多的属性和方法,所以在设计枚举时考虑到这些因素,提出了更为全面的设计方案:可以在枚举中定义属性、方法、实现接口。在枚举中定义更多的结构示例代码如下:

enum Color {
    RED("红色"),GREEN("绿色"),BLUE("蓝色");
    private String title;
    //构造方法私有化
    private Color(String color) {
        this.title = color;
    }
    @Override
    public String toString() {
        return this.title;
    }
}

public class Test{
    public static void main(String[] args) {
        System.out.println(Color.BLUE);
    }
}
//蓝色

枚举类还可以实现接口,这样枚举中的每一个对象都成了接口对象,示例代码如下:

//枚举类实现接口
interface IColor {
    public String getColor();
}
enum Color implements IColor {
    RED("红色"),GREEN("绿色"),BLUR("蓝色");
    private String title;
    //构造方法私有化
    private Color(String title) {
        this.title = title;
    }

    @Override
    public String toString() {
        return this.title;
    }

    @Override
    public String getColor() {
        return this.title;
    }
}

public class Test {
    public static void main(String[] args) {
        IColor iColor = Color.RED;
        System.out.println(iColor.getColor());
    }
}
//红色

1.4.枚举应用

枚举类最大的特点是几个对象可以同时使用
定义一个表示性格的枚举类,只能有两个对象:

enum Sex {
    MALE("男"),FEMALE("女");
    private String title;
    private Sex(String title) {
        this.title = title;
    }
    @Override
    public String toString() {
        return this.title;
    }
}

class Person {
    private String name;
    private int age;
    private Sex sex;
    public Person(String name, int age, Sex sex){
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "Person [name = " + name + ",age = " + age + ",sex = " + sex + "]";
    }
}

public class Test {
    public static void main(String[] args) {
        Person per = new Person("邹鸡儿", 20, Sex.MALE);
        System.out.println(per);
    }
}
//Person [name = 邹鸡儿,age = 20,sex = 男]

另外要注意的是,枚举本身还支持switch判断,示例代码如下:

enum Sex {
    MALE, FEMALE
}

public class Test {
    public static void main(String[] args) {
        switch(Sex.MALE){
            case MALE :
                System.out.println("男");
                break;
            case FEMALE :
                System.out.println("女");
                break;
        }
    }
}
//男

2.注解

3.接口定义加强

4.Lambda表达式

5.方法引用

6.内建函数式接口

猜你喜欢

转载自blog.csdn.net/LiLiLiLaLa/article/details/89164735