枚举
        枚举属于加强版的多例设计模式
        
    多例设计模式与枚举
        多例设计模式的本质在于构造方法的私有化。而后在类的内部产生若干个实例化对象,随后利用一个 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. Android 开发进程 0.35 升级编译版本Android12

    Android12升级 工作需要升级到编译版本31 在这里记录一下遇到的问题. 错误:Manifest merger failedManifest merger failed 这个问题通常搜到的答案是 ...

  2. FastAPI(59)- 详解使用 OAuth2PasswordBearer + JWT 认证

    JWT JSON Web Tokens 它是一个将 JSON 对象编码为密集且没有空格的长字符串的标准 使用 JWT token 和安全密码 hash 使应用程序真正安全 JWT 小栗子 eyJhbG ...

  3. t-SNE算法

    t-SNE 算法 前言 t-SNE(t-distributed stochastic neighbor embedding) 是用于降维的一种机器学习算法,由 Laurens van der Maat ...

  4. 调试器地址出现大小端紊乱,引发的异常: 0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突。

    今天在编写一系列新增需求代码后,开始调试代码 发现上个版本正常可运行的代码出现了:引发的异常: 0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突. 上个版本数代码 ...

  5. sql提示1055 不让你group by

    是不是突然写好的sql语句 部署上去就 Expression #2 of SELECT list is not in GROUP BY clause and containsnonaggregated ...

  6. 手把手教你写hexo博客

    市面上现在有各种博客框架,本博客教大家的是Hexo博客框架,目前比较火.搭建博客中遇到各种各样问题,网上方案也比较成熟. 一.搭建环境 安装 git 安装 node.js 安装 Hexo npm in ...

  7. WPF中的命令(Command)

    这节来讲一下WPF中的命令(Command)的使用. [认识Command] 我们之前说过,WPF本身就为我们提供了一个基础的MVVM框架,本节要讲的命令就是其中一环,通过在ViewModel中声明命 ...

  8. 什么,你还使用 webpack?别人都在用 vite 搭建项目了

    一.vite 到底是干嘛的? vite 实际上就是一个面向现代浏览器,基于 ES module 实现了一个更轻快的项目构建打包工具. vite 是法语中轻快的意思. vite 的特点: 1.轻快的冷服 ...

  9. kivy 选择框

    from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.lang import builder # 注册 ...

  10. Linux中检查字符串是否为合法IP地址的shell脚本

    #!/bin/bash #判断IP地址是否为有效IP CHKECK_IP () { CHECK_STEP1=`echo $1 | awk -F"." '{print NF}'` i ...