java高新技术-枚举

1.什么是枚举

枚举是jdk1.5后才增加的新特性

用枚举就是要规定一个新的类型,那么要用这个类型的值就必须是我规定的那些值。如果不是那些值,编译器就会报错,好处是编译时就会做出判断

2.用普通类模拟枚举的实现原理

  

package com.java.javaenhance1;
/**
 * 用普通的java类,来实现枚举的原理
 * 这个类所定义出来的值只能是那么几个,这个值不是一个普通基本类型的值,而是一个对象
 * @author Administrator
 *
 */
public class WeekDay {

    private WeekDay() {
    }

    public final static WeekDay SUN = new WeekDay();
    public final static WeekDay MON = new WeekDay();

    public WeekDay nextDay() {
        if (this == SUN) {
            return MON;
        } else {
            return SUN;
        }
    }

    public String toString() {
        return this == SUN ? "SUN" : "MON";
    }

}
package com.java.javaenhance1;

public class EnumTest {

    public static void main(String[] args) {

        WeekDay weekDay = WeekDay.SUN;
        System.out.println(weekDay.nextDay()); //MON
        System.out.println(weekDay.toString());  //SUN
    }

}

这里还可以使用抽象方法的方式实现nextDay(),就将大量的if.else语句转义成了一个个独立的类。

package com.java.javaenhance1;
/**
 * 用普通的java类,来实现枚举的原理
 * 这个类所定义出来的值只能是那么几个,这个值不是一个普通基本类型的值,而是一个对象
 * @author Administrator
 *
 */
public abstract class WeekDay {

    private WeekDay() {
    }

    //带一个{} 表示匿名子类
    public final static WeekDay SUN = new WeekDay(){

        @Override
        public WeekDay nextDay() {
            return MON;
        }
    };
    public final static WeekDay MON = new WeekDay(){

        @Override
        public WeekDay nextDay() {
            return SUN;
        }
    };

    //还可以使用抽象类的方式,各自实现nextDay()
    /*public WeekDay nextDay() {
        if (this == SUN) {
            return MON;
        } else {
            return SUN;
        }
    }*/
    //nextDay分别有子类去完成
    public abstract WeekDay nextDay();

    public String toString() {
        return this == SUN ? "SUN" : "MON";
    }

}

3.java5的枚举的基本应用

package com.java.javaenhance1;

public class EnumTest {

    public static void main(String[] args) {

        WeekDay weekDay2 = WeekDay.FRI;
        System.out.println(weekDay2); //FRI 枚举自己实现了toString()
        System.out.println(weekDay2.name());//FRI
        System.out.println(weekDay2.ordinal());  //5 元素中排第几,第一个从0开始
        //把一个字符串变成一个对象的枚举元素
        System.out.println(WeekDay.valueOf("SUN")); //SUN
        //把枚举中的所有元素装进数组里,可用于遍历
        System.out.println(WeekDay.values().length); //7
    }

    /**
     * 枚举相当于一个类,枚举中的元素相当于这个类搞出来的实例对象
     * @author Administrator
     *
     */
    public enum WeekDay{
        SUN,MON,TUE,WED,THI,FRI,SAT
    }

}

4.实现带有构造方法的枚举(带有参数的构造方法)

/**
     * 枚举相当于一个类,枚举中的元素相当于这个类搞出来的实例对象
     * @author Administrator
     *
     */
    public enum WeekDay{
        SUN(1),MON,TUE,WED,THI,FRI,SAT;  //定义的所有其他信息必须位于元素之后
        private WeekDay(){System.out.println("first");}    //构造方法必须是private类型的
        private WeekDay(int day){System.out.println("second");}
    }

在枚举元素的后边跟上一个括号,()中的参数代表元素初始化时用的哪个构造方法,如果没有(),表示调用默认空参构造器

5.实现带有抽象方法的枚举

内部类前边可以有4中访问修饰符,外部类只有两种,public和默认

带有抽象方法的枚举,元素需要实现抽象的方法,使用RED{} 匿名子类的方式

RED(30) 表示构造实例对象时用的是哪个构造方法

public enum TrafficLamp{
        RED(30){  //使用内部类方式实现抽象类
            @Override
            public TrafficLamp nextLamp() {
                return GREEN;
            }
        },
        GREEN(45){
            @Override
            public TrafficLamp nextLamp() {
                return YELLOW;
            }
        },
        YELLOW(5){
            @Override
            public TrafficLamp nextLamp() {
                return RED;
            }
        };
        public abstract TrafficLamp nextLamp();
        private int time;
        private TrafficLamp(int time){this.time = time;}
    }

 经过编译后,会自动生成子类的 .class文件

枚举只有一个成员时,就可以作为一种单例的实现方式。

如果要写一个单例,就可以写一个枚举,只有一个元素。

时间: 2024-12-19 09:58:04

java高新技术-枚举的相关文章

Java核心 --- 枚举

Java核心 --- 枚举 枚举把显示的变量与逻辑的数字绑定在一起在编译的时候,就会发现数据不合法也起到了使程序更加易读,规范代码的作用 一.用普通类的方式实现枚举 新建一个终态类Season,把构造方法设为私有,因为枚举值不能随意增加因为不能new出这个类的对象,所以需要定义成员变量,把new写在类的内部这样,就可以在类的外部通过访问类的静态成员变量的方式访问到枚举值通过这样的方式,只能在类的外部使用在枚举类的内部定义的枚举值 类Season里面是可以有方法的,我们设置地球又公转了四分之一方法

黑马程序员——Java高新技术代理

代理 普通代理 很多时候,我们使用别人代码往往会发现别人代码的功能并不是十分符合我们的需求,调用别人的方法的时候,总是先new一个对象,然后我们的前处理做完,然后调用别人代码的方法,再加入后处理,这样做往往十分麻烦.代理就为其他类提供了一种控制其对象的方法.代理类和委托类必须实现同一个接口,这样代理类才能在需要的时候代替委托类对象,执行委托类的方法. interface Solution{ public void doSomething(); } //委托类Demo实现了接口 class Dem

Java中枚举的使用

一. JDK5之前的实现方式 在枚举类型出现之前,java是通过在接口或者类中定义public static final 的变量来实现的. 比如对于四季的描述: --------------------------------------------------------------------------------- public interface Season {    public static final int SEASON_SPRINT = 1;    public stati

java的枚举2

首先先理解一下java中枚举的本质. java的世界中一切皆是类,下面通过一个例子解释一下enum的本质: package cn.xnchall.enumeration; public class Grade { public void test() { print(grade.A); } public void print(grade g) { //print A B C D E } } /*class grade{ private grade(){} public static final

黑马程序员——java高新技术(新特性、反射、泛型)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- java高新技术 第一部分——JDK1.5新特性 1.增强for循环 格式: for(元素类型 变量名 : Collection集合 & 数组 ) { }//增强for循环括号里写两个参数,第一个是声明一个变量,第二个就是需要迭代的容器 高级for循环和传统for循环的区别: 高级for循环在使用时,必须要明确被遍历的目标.这个目标,可以是Collection集合或者数组,如果遍历Collec

Java中枚举类型的使用

虽然Java中有枚举类型这种数据类型,但是很少用,其实当用到星期.月份.四季等数据集的时候,无疑,枚举类型不仅很方便地解决了整数和字符串的映射问题,而且极大地提高了程序的可读性. 下面就用简单的程序代码来说明这种问题: 1.枚举类型自动赋值,默认情况下枚举变量从前到后分别被赋值为0.1.2.3.4.5....然后用循环的方式将枚举变量的名称和其对应的下标打印出来. /* * @author mnmlist * @date 8/18/2015 * @description of the basic

Swift和Java在枚举方面的比较

1. 在Swift和Java关于枚举方面,两个语言语法相似. Swift定义枚举: enum CompassPoint{ case Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune } Java定义枚举: public enum ColorSelect { red, green, yellow, blue; } 2. 枚举和switch结合使用 Swift代码如下: enum CompassPoint{ case Merc

Java Enum枚举

1.代码 import java.lang.*; // enum showing Mobile prices enum Mobile { Samsung(400), Nokia(250),Motorola(325); int price; Mobile(int p) { price = p; } int showPrice() { return price; } } public class EnumDemo { public static void main(String args[]) {

Java enum枚举类型

java的枚举类型详解: 简单示例: public enum Color{ RED,BLUE,BLACK,YELLOW,GREEN } 复杂示例(带自定义构造方法与类型) public enum EnumTest { FRANK("The given name of me"), LIU("The family name of me"); private String context; private String getContext(){ return this.