多例设计模式特点:构造方法私有化,而后在类的内部实例化好若干个对象,并且通过static方法返回,按照之前编写的多例设计是存在问题的
范例:观察问题
package listen;
class Color{
private String title;
private static final Color RED=new Color("红色");
private static final Color GREEN=new Color("录色");
private static final Color BLUE=new Color("蓝色");
private Color(String title) {
this.title=title;
}
public String toString() {
return this.title;
}
public static Color getInstance(int ch) {
switch(ch) {
case 0:
return RED;
case 1:
return GREEN;
case 2:
return BLUE;
default :
return null;
}
}
}
public class Listenb {
public static void main(String[] args) {
// TODO Auto-generated method stub
Color red=Color.getInstance(2);
System.out.println(red);
}
}
在之前的代码之中,实现的多例设计模式里面存在一个矛盾,发现用户实际并不知道类中存在多少个对象,而且所有的对象必须通过一个static方法,传入一些数字类取得
从JDK1.5增加一个enum关键字,使用它可以定义枚举
范例:定义枚举
enum Color{
RED,GREEN,BLUE;
}
枚举之中对象都是使用static final定义的,那么一定需要使用大写表示。
范例:使用枚举
package listen;
enum Color{
RED,GREEN,BLUE;
}
public class Listenh {
public static void main(String[] args) {
// TODO Auto-generated method stub
Color red=Color.RED;
System.out.println(red);
}
}
此时可以非常清楚的发现,直接利用枚举对象就可以取得里面保存对象信息。同时在枚举操作的过程里面还可以取得全部可对象
范例:输出枚举的所有内容
package listen;
enum Colora{
RED,GREEN,BLUE;
}
public class Listenh {
public static void main(String[] args) {
// TODO Auto-generated method stub
for(Colora c: Colora.values()) {
System.out.println(c);
}
}
}
通过之前的演示应该清楚了enum关键字的作用,但是严格来讲,在java之中,使用enum关键字定义的枚举对象严格来讲就相当于是一个使用class
定义的类,而后继承了Eunm类是一样的,首先Enum是一个抽象类,在Enum类之中定义了如下的方法:
构造方法:protected Enum(String name,int ordinal),构造被封装,子类可以调用。
取得枚举名字:public final String name();
取得枚举:public final int ordinal()
范例:调用Enum类的方法
package listen;
enum Colorb{
RED,GREEN,BLUE;
}
public class Listenha {
public static void main(String[] args) {
// TODO Auto-generated method stub
for(Colorb c: Colorb.values()) {
System.out.println(c.name()+","+c.ordinal());
}
}
}
面试题:解释Enum和enum的区别?
enum是一个关键字,而Enum是一个抽象类
使用enum定义的结构就相当于一个类继承了Enum类。
在枚举之中定义其它结构
枚举是多例设计模式的实现,但是通过研究多例设计模式,可以清楚发现,多例设计模式之中,除了定义类对象之外,实际上还可以构造方法
普通方法,属性,而枚举也可以做到。但有如下要求
1.枚举之中定义多个结构的时候,枚举的对象要写在类第一行;
2.枚举毕竟属于多例设计,构造方法绝对不能使用public表示
范例:在枚举中定义其它结构
enum Colorc{
RED("红色"),GREEN("录色"),BLUE("蓝色");//对象
private String title;
private Colorc(String title) {
this.title=title;
}
public String toString() {
return this.title;
}
}
public class Listenhb {
public static void main(String[] args) {
// TODO Auto-generated method stub
for(Colorc c: Colorc.values()) {
System.out.println(c);
}
}
}
处理以上的结构,枚举作为一个特殊的类,也可以让其实现接口。
package listen;
interface Messagea{
public String getInfo();
}
enum Colord implements Messagea{
RED("红色"),GREEN("录色"),BLUE("蓝色");//对象
private String title;
private Colord(String title) {
this.title=title;
}
public String getInfo() {
return this.title;
}
public String toString() {
return this.title;
}
}
public class Listenhc {
public static void main(String[] args) {
// TODO Auto-generated method stub
Messagea msg=Colord.RED;//向上转型
System.out.println(msg.getInfo());
}
}
枚举的概念清楚之后,思考一下枚举能做什么?例如:人的性别是固定的两个。
范例:使用枚举
package listen;
enum Sex{
MALE("男"),FEMALE("女");
private String title;
private Sex(String title) {
this.title=title;
}
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;
}
public String toString() {
return "姓名:"+this.name+",年龄:"+this.age+",性别:"+this.sex;
}
}
public class Listenhd {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(new Person("张三",20,Sex.MALE));
}
}