枚举
        枚举属于加强版的多例设计模式
        
    多例设计模式与枚举
        多例设计模式的本质在于构造方法的私有化。而后在类的内部产生若干个实例化对象,随后利用一个 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. mimikatz使用笔记

    一.获取密码# privilege::debug sekurlsa::logonpasswords mimikatz.exe "sekurlsa::debug" "sek ...

  2. 关于突破 SESSION 0 隔离场景发现的一些问题

    0x00 Tricks 0x01 用ZwCreateThreadEx 在 Windows 10 下直接通过管理员权限+SeDebugPrivilege启用. 0x02 用CreateRemoteThr ...

  3. Java秘诀!Java关系运算符介绍

    运算符丰富是 Java 语言的主要特点之一,它提供的运算符数量之多,在高级语言中是少见的. Java 语言中的运算符除了具有优先级之外,还有结合性的特点.当一个表达式中出现多种运算符时,执行的先后顺序 ...

  4. node二进制安装

    你可能因为重装系统node的npm不管用, 但是node管用, 我不知道为什么, 但是 二进制安装就好了 管他那么多 下面这些网址你就可以了 https://blog.csdn.net/wocaoni ...

  5. [源码解析]PyTorch如何实现前向传播(2) --- 基础类(下)

    [源码解析]PyTorch如何实现前向传播(2) --- 基础类(下) 目录 [源码解析]PyTorch如何实现前向传播(2) --- 基础类(下) 0x00 摘要 0x01 前文回顾 0x02 Te ...

  6. 激活NX窗口的按钮

    原理:取得按钮名称以后,通过运行宏文件激活按钮 Imports System.IO Imports System.Runtime.InteropServices Imports NXOpen.Menu ...

  7. Django开发个人博客入门学习经验贴

    [写在前面] 入门学习搭建个人博客系统首先还是参考大佬们的经验,记得刚入手Django的时候,一篇博客大佬说过一句话,做技术的不要一开始就扎头于细节中,先把握整体框架,了解这个对象之后再去了解细节,进 ...

  8. python中单引号、双引号和三引号

    在python中字符串可以用双引号表示,也可以用单引号表示: str1 = 'hello world'str2 = "hello world" 这两种字符串的表示方法没有区别. p ...

  9. Vulnhub实战-FALL靶机👻

    Vulnhub实战-FULL靶机 下载地址:http://www.vulnhub.com/entry/digitalworldlocal-fall,726/ 1.描述 通过描述我们可以知道这个靶机枚举 ...

  10. jquery-无缝滚动

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...