前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java——枚举基础应用总结(多例设计模式、Enum类、枚举的实际应用)

Java——枚举基础应用总结(多例设计模式、Enum类、枚举的实际应用)

作者头像
Winter_world
发布2020-09-25 10:12:59
1.2K0
发布2020-09-25 10:12:59
举报

1、多例设计模式与枚举

多例设计模式一定是构造方法私有化,而后在内部类种产生若干个实例化对象。

【举例】:定义颜色基色的多例模式

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Color c = Color.getInstance(1);
        System.out.println(c.toString());
    }
}

class Color{
    private static final Color RED = new Color("红色");
    private static final Color GREEN = new Color("绿色");
    private static final Color BLUE = new Color("蓝色");

    private String title;
    public Color(String title) {
        this.title = title;
    }

    @Override
    public String toString() {
        return "Color{" +
                "title='" + title + '\'' +
                '}';
    }
    public static Color getInstance(int ch){
        switch (ch){
            case 0:
                return RED;
            case 1:
                return GREEN;
            case 2:
                return BLUE;
                default:
                    return null;
        }
    }
}

以上代码,JDK1.5前编写OK,但是很麻烦,getInstance方法没什么意义,且内部中实例化对象的个数未知。因此,JDK1.5开始提供了enum关键字,其可以实现与多例相同的功能,如下所示:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Color c = Color.RED;
        System.out.println(c);
    }
}

enum Color{
    RED,GREEN,BLUE;
}

多例是枚举的设计思想来源,所以枚举中定义对象都要用大写字母表示,此外,枚举的最大的支持在于可以实现所有枚举对象的遍历操作。

        for(Color c:Color.values()){
            System.out.println(c);
        }

2、java.lang.Enum类

使用enum定义的枚举类不属于一个新的结构,本质上相当于一个类继承了java.lang.Enum类的形式,观察下Enum类的定义形式:

public abstract class Enum<E extends Enum<E>> extends Object implements Comparable<E>, Serializable

Enum类中定义的构造方法:

protected Enum(String name, int ordinal)

protected 权限表示只能在本包或不同包的子类才可以调用,其实就是构造方法的封装。该构造方法中第一个参数表示对象名字,第二个表示对象序号。

Enum类中有两个方法,可以取得名字和序号:

  • public final String name()
  • public final int ordinal()
        for(Color c:Color.values()){
            System.out.println(c.name()+c.ordinal());
        }

枚举中的序号是根据对象的定义顺序来的。

【面试题】:请解释Enum与enum的区别?

  • enum是JDK1.5后新增的关键字,用来定义枚举;
  • Enum是一个抽象类,使用enum定义的枚举本质就相当于一个继承了Enum类。

3、枚举结构定义

枚举在Java中就属于一种特殊的类,但是类中的组成是很丰富的:属性、方法、构造方法、实现接口、继承抽象类,这些功能枚举都具备。

【举例】:定义其他结构

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        for(Color c:Color.values()){
            System.out.println(c.name()+c.ordinal()+c);
        }
    }
}

enum Color{
    RED("红色"),GREEN("绿色"),BLUE("蓝色");
    private String title;
    private Color(String title) {
        this.title = title;
    }

    @Override
    public String toString() {
        return "Color{" +
                "title='" + title + '\'' +
                '}';
    }
}

除了可以定义一些基本结构外,枚举也可以实现接口。对于接口的实现有两种模式:

【举例】:统一实现接口

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        IMessage msg = Color.RED;
        System.out.println(msg.getColor());
    }
}

enum Color implements IMessage{
    RED("红色"),GREEN("绿色"),BLUE("蓝色");
    private String title;
    private Color(String title) {
        this.title = title;
    }

    @Override
    public String toString() {
        return "Color{" +
                "title='" + title + '\'' +
                '}';
    }

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

【举例】:每个枚举对象采用匿名内部类形式实现

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        IMessage msg = Color.RED;
        System.out.println(msg.getColor());
    }
}

enum Color implements IMessage{
    RED("红色"){
        public String getColor() {
            return "红色";
        }
    },GREEN("绿色"){
        public String getColor() {
            return "绿色";
        }
    },BLUE("蓝色"){
        public String getColor() {
            return "蓝色";
        }
    };
    private String title;
    private Color(String title) {
        this.title = title;
    }

    @Override
    public String toString() {
        return "Color{" +
                "title='" + title + '\'' +
                '}';
    }
    
}
interface IMessage{
    public String getColor();
}

枚举中还可以定义抽象方法,实际上开发基本不会用~~包括以上的其他结构,了解即可,尽量不用。

4、枚举的实际应用

枚举就是表示一个类的对象选用范围,下面定义一个人的类,里面有性别。

【举例】:实现枚举的应用

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        System.out.println(new Person("张三",10,Sex.MALE));
    }
}

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;
    }

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

以上代码不使用枚举也可以实现,所以,开发中没有对枚举使用的强制限制,看个人习惯,熟悉C语言的可能会比较喜欢用。

5、总结

1)enum宇Enum类的关系;

2)枚举与多例设计模式的关系。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-05-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、多例设计模式与枚举
  • 2、java.lang.Enum类
  • 3、枚举结构定义
  • 4、枚举的实际应用
  • 5、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档