枚举
        枚举属于加强版的多例设计模式
        
    多例设计模式与枚举
        多例设计模式的本质在于构造方法的私有化。而后在类的内部产生若干个实例化对象,随后利用一个 static 静态方法进行指定实例化对象的获得
        
        范例:多例

package cn.mysterious;

public class Enumeration {
public static void main(String[] args) {
Color redInstance = Color.getInstance(0);
System.out.println(redInstance);
}
}
class Color{
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 String title;
private Color(String title){
this.title = title;
}
private void getInstance(int ch) {
// TODO Auto-generated method stub
switch (ch) {
case 0 : return RED;
case 1 : return GREEN;
case 2 : return BLUE;
default : return null;
}
}
public String toString() {
// TODO Auto-generated method stub
return this.title;
}
}

这个时候有人开始考虑了,多例实现的太麻烦了。多例设计是在JDK1.5之前出现的主要设计模式,其主要的目的是为了解决java缺少枚举带来的影响
        如果在JDK1.5之后,多例的设计可以变为如下形式:

package cn.mysterious;

public class Enumeration {
public static void main(String[] args) {
Color redInstance = Color.RED;
System.out.println(redInstance);
}
}
enum Color{
RED,GREEN,BLUE;
}

用枚举搞一个结构其最终的效果和多例是一样的,所以枚举的主要功能是替代多例设计

    Enum 与 enum
        在JDK1.5之后追加有enum 关键字,那么这个关键字的主要目的是进行枚举定义
        但是使用enum严格来讲并不算是一种所谓的新结构它只不过是相当于定义一个类,并且这个类默认继承了Enum父类
        Enum类的定义观察:
            public abstract class Enum<E extends Enum<E>>
            extends Object
            implements Comparable<E>, Serializable
            
        Enum类里面允许使用的属性的类型必须是Enum 类或其子类的类型
        但是这一操作基本上我们不需要去关注,对应的类型(RED,GREEN,BLUE,都是Color 的对象,而Color是一个枚举,枚举继承Enum)
            
        而在Enum类中提供有一个构造方法:protected Enum(String name,int ordinal)
        protected 是一个封装性,证明此时的Enum 构造方法值允许本包的类或不同的子类调用,在这个构造方法里面设置有 name (名字) 和 ordinal (编号)
        这个构造也不是由你调用的,是由Enum 调用的
            
        而在Enum类里面也提供有两个对应的方法:
            获得对象的名字: public final String name()
            获得对象的序号: public final int ordinal()
            
        范例:在枚举类对象中使用以上两个方法:

package cn.mysterious;

public class Enumeration {
public static void main(String[] args) {
Color redInstance = Color.RED;
System.out.println(redInstance.name());
System.out.println(redInstance.ordinal());
}
}
enum Color{
RED,GREEN,BLUE;
}
/* 结果是
RED
0
*/

默认的名字就是对象名字,序号就是对象定义的顺序
        而将多例定义为枚举之后还可以取得全部对象信息,因为所有的枚举类中包含有一个 values() 方法,
        这个方法可以以对象数据的形式返回全部枚举对象
        
        范例:枚举取得全部对象

package cn.mysterious;

public class Enumeration {
public static void main(String[] args) {
for (Color c: Color.values()) {
System.out.println(c.ordinal()+ "=" + c.name());
}
}
}
enum Color{
RED,GREEN,BLUE;
}

面试题:请解释 enum 与 Enum 的区别?
            enum是一个JDK1.5后追加的关键字,使用enum 可以定义枚举类,相当于定义一个类继承子Enum父类
            
    在枚举中定义类结构
        枚举hi在类的基础上发展起来的,所以枚举本身也可以进行构造方法,属性,普通方法的定义
        但是需要注意的是:多例设计之中重点的要求“构造方法私有化(私有化不是简单的指 private ,还包括 default,protected )”
    
        范例:定义枚举类型

package cn.mysterious;

public class Enumeration {
public static void main(String[] args) {
for (Color c: Color.values()) {
System.out.println(Color.BLUE);// 直接调用 toString()
}
}
}
enum Color{
GREEN("绿色"),RED("红色"),BLUE("蓝色"); // 对象要写在第一行
private String title;
private Color(String title){
this.title = title;
}
public String toString(){
return this.title;
}
}

除了可以进行基本的结构定义之外,枚举里面还可以实现接口
        范例:枚举实现接口

package cn.mysterious;

public class Enumeration {
public static void main(String[] args) {
IMessage msg = Color.BLUE; // 对象向上转型
System.out.println(msg.getColor());
}
}
interface IMessage{
public String getColor();
}
enum Color implements IMessage{ // 实现父接口
GREEN("绿色"),RED("红色"),BLUE("蓝色"); // 对象要写在第一行
private String title;
private Color(String title){
this.title = title;
}
public String toString(){
return this.title;
}
@Override
public String getColor() {
// TODO Auto-generated method stub
return this.title;
}
}

普通类是无法定义抽象的,但是枚举类里面可以定义抽象方法于是这个时候枚举的每一个实例化对象都必须去覆写此抽象方法
        范例:枚举定义抽象方法

package cn.mysterious;

public class Enumeration {
public static void main(String[] args) {
System.out.println(Color.BLUE.getColor());
}
} enum Color { // 实现父接口
GREEN("绿色"){
public String getColor() {
// TODO Auto-generated method stub
return "绿色";
}
},RED("红色"){
public String getColor() {
// TODO Auto-generated method stub
return "红色";
}
},BLUE("蓝色"){
public String getColor() {
// TODO Auto-generated method stub
return "蓝色";
}
}; // 对象要写在第一行
private String title;
private Color(String title){
this.title = title;
}
public String toString(){
return this.title;
}
public abstract String getColor();
}

对以上的程序结构有些了解就可以了,java之中的枚举设计非常复杂,实际之中不需要那么复杂
        
    枚举应用
        下面通过一个简单的程序来观察枚举的使用
        
        范例:定义一个描述用户的类。里面有用户的性别

package cn.mysterious;

public class Enumeration {
public static void main(String[] args) {
Member mem = new Member("少公子",20,Sex.MALE);// 创建新用户
System.out.println(mem);
}
}
class Member{
private String name;
private int age;
private Sex sex;
public Member(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;
}
}
enum Sex{
MALE("男"),FEMALE("女");
private String title;
private Sex(String title){
this.title = title;
}
public String toString(){
return this.title;
}
}

对于以上的操作,如果不使用枚举没有任何问题,所以对于枚举我们需要公正的认识它:如果你习惯于使用枚举开发,那么就继续用,如果没习惯,能看懂可以不用

菜鸡的Java笔记 - java 枚举的更多相关文章

  1. Java 笔记 —— java 和 javac

    Java 笔记 -- java 和 javac h2{ color: #4ABCDE; } a{ text-decoration: none !important; } a:hover{ color: ...

  2. 菜鸡的Java笔记 - java 断言

    断言:assert (了解)        所谓的断言指的是在程序编写的过程之中,确定代码执行到某行之后数据一定是某个期待的内容        范例:观察断言 public class Abnorma ...

  3. 菜鸡的Java笔记 - java 正则表达式

    正则表达式 RegularExpression        了解正则表达式的好处        正则表达式的基础语法        正则表达式的具体操作            content (内容 ...

  4. 菜鸡的Java笔记 - java 线程常用操作方法

    线程常用操作方法        线程的命名操作,线程的休眠,线程的优先级            线程的所有操作方法几乎都在 Thread 类中定义好了            线程的命名和取得      ...

  5. 菜鸡的Java笔记 - java 访问控制权限

    java中四种访问控制权限的使用                内容            在java里面一共定义有四个权限,按照由小到大的顺序:private<defaule<prote ...

  6. 菜鸡的Java笔记 - java 常用类库

    CommonClassLibrary 常用类库        定时调度            定时调度指的是每到一个时刻,都会自动的产生某些特定的操作形式                    con ...

  7. 菜鸡的Java笔记 - java 反射机制

    反射机制        1.观察 Class 类的使用        2.利用反射改善工程设计模式        3.反射操作类结构            content (内容)        1. ...

  8. 菜鸡的Java笔记 java基础类库 BaseClassLibrary

    java基础类库 BaseClassLibrary        StringBuffer 类的特点        StringBuffer,StringBuilder,String 类之间的关系   ...

  9. 菜鸡的Java笔记 java数据库编程(JDBC)

    java数据库编程(JDBC)        介绍 JDBC 的基本功能            content (内容)        现在几乎所有的项目开发过程之中都不可能离开数据库,所以在java ...

随机推荐

  1. 题解 [JSOI2011]柠檬

    题目传送门 题目大意 给出一个区间,每个点都有一个颜色,把这个区间分为许多块,每一块的权值为 \(\max\{s\times t^2\}\) ,其中 \(s\) 为某种颜色,\(t\) 为该颜色在该块 ...

  2. mysql order by语句流程是怎么样的

    order by流程是怎么样的 注意点: select id, name,age,city from t1 where city='杭州' order by age limit 1000; order ...

  3. 对比7种分布式事务方案,还是偏爱阿里开源的Seata,真香!(原理+实战)

    前言 这是<Spring Cloud 进阶>专栏的第六篇文章,往期文章如下: 五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强? openFeign夺命连环9问,这谁受得了? 阿里面 ...

  4. 机器学习:EM算法

    EM算法 各类估计 最大似然估计 Maximum Likelihood Estimation,最大似然估计,即利用已知的样本结果,反推最有可能(最大概率)导致这样结果的参数值的计算过程. 直白来讲,就 ...

  5. UltraSoft - Alpha - Postmortem 事后分析

    Alpha阶段 Postmortem会议 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 主要是解决DDL提醒功能的问题,定义的比较清楚,对典型用户和典 ...

  6. 期望dp好题选做

    前言: 最近连考两场期望dp的题目,sir说十分板子的题目我竟然一点也不会,而且讲过以后也觉得很不可改.于是开个坑. 1.晚测10 T2 大佬(kat) 明明有\(O(mlog)\)的写法,但是\(m ...

  7. 单片机I/O口推挽与开漏输出详解(力荐)

    推挽输出:可以输出高,低电平,连接数字器件;推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止. 开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电 ...

  8. 硬件工程师必须掌握的PCB叠层设计内容

    总的来说叠层设计主要要遵从两个规矩: 1. 每个走线层都必须有一个邻近的参考层(电源或地层); 2. 邻近的主电源层和地层要保持最小间距,以提供较大的耦合电容; 下面列出从两层板到八层板的叠层来进行示 ...

  9. 计算机网络传输层之TCP拥塞控制(慢开始与拥塞避免、快重传和快恢复)

    文章转自:https://blog.csdn.net/weixin_43914604/article/details/105532044 学习课程:<2019王道考研计算机网络> 学习目的 ...

  10. (转载)linux chmod命令用法

    chmod----改变一个或多个文件的存取模式(mode) chmod [options] mode files   只能文件属主或特权用户才能使用该功能来改变文件存取模式.mode可以是数字形式(八 ...