zoukankan      html  css  js  c++  java
  • Java学习笔记-枚举类

    实例有限且固定的类成为枚举类

    枚举类的实现

    • 早期时候的实现形式:
    public static final int SEASON_SPRING = 1;
    public static final int SEASON_SUMMER = 2;
    public static final int SEASON_FAIL = 3;
    public static final int SEASON_WINTER = 4;
    
    • 这种方式虽然实现简单,但存在很多问题:
      ①类型不安全(二者可运算)
      ②没有命名空间
      ③打印输出的意义不明确

    如今的枚举实现:

    • Java5以后增加了enum关键字(与class、interface地位相同)来定义枚举。可以拥有成员变量、方法,可以实现一个或多个接口,也可定义构造器。一个Java源文件中最多只能定义一个public访问权限的枚举类,且该Java源文件也必须和该枚举类的类名相同
    • 枚举类与普通类的区别:
      • 枚举类可以实现一个或多个接口,使用enum定义的枚举类默认继承了java.lang.Enum类,而不是默认继承Object类,因此枚举类不能显示继承其他父类。其中java.lang.Enum类实现了java.lang.Serializable和java.lang.Comparable两个接口
      • 使用enum定义、非抽象的枚举类默认会使用final修饰,因此枚举类不能派生子类
      • 枚举类的构造器只能使用private访问控制符,如果省略了构造器的访问控制符,则默认使用private修饰;如果强制指定访问控制符,则只能指定private
      • 枚举类的所有实例必须在枚举类的第一行显式列出,否则这个枚举类永远不能产生实例
    • 枚举类默认提供了一个value()方法,该方法可以很便捷的遍历所有的枚举值
    public enum SeasonEnum{
    	SPRING,SUMMER,FAIL,WINTER;
    }
    
    • 在使用时候可以这样:SeasonEnum.SPRING。在switch使用时可直接用SPRING
    • java.lang.Enum类提供了以下方法:
      • int compareTo (E o):该方法用于与指定枚举对象比较顺序,同一个枚举实例只能和相同类型的枚举实例进行比较。如果该枚举对象位于指定枚举对象之后,则返回正整数;如果该枚举对象位于指定枚举对象之前,则返回负数,否则返回零
      • String name():返回枚举实例的名称
      • int ordinal():返回枚举值在枚举类中的索引值
      • String toString():返回枚举常量的名称
      • public static <T extends Enum<T>>T valueOf(Class<T> enumType,String name):返回指定枚举类中指定名称的枚举值

    枚举类的成员变量、方法和构造函数

    public enum Gender {
    	MALE,FEMALE;
    	// 定义一个public修饰的实例变量
    	public String name;
    }
    
    public enum Gender{
    	MALE,FEMALE;
    	private String name;
    	public void setName(String name){
    		switch (this){
    			case MALE:
    				if (name.equals("男")){
    					this.name = name;
    				}else{
    					System.out.println("参数错误");
    					return;
    				}
    				break;
    			case FEMALE:
    				if (name.equals("女")){
    					this.name = name;
    				}else{
    					System.out.println("参数错误");
    					return;
    				}
    				break;
    		}
    	}
    	public String getName(){
    		return this.name;
    	}
    }
    
    public enum Gender{
    	// 此处的枚举值必须调用对应构造器来创建
    	MALE("男"),FEMALE("女");
    	private final String name;
    	// 枚举类的构造器只能使用private修饰
    	private Gender(String name){
    		this.name = name;
    	}
    	public String getName(){
    		return this.name;
    	}
    }
    
    • 其实也就相当于以下代码:
    public static final Gender MALE = new Gender("男");
    public static final Gender FEMALE = new Gender("女");
    

    实现接口的枚举类

    public enum Gender implements GenderDesc{
    	// 此处的枚举值必须调用对应构造器来创建
    	MALE("男")
    	// 花括号部分实际上是一个类体部分
    	{
    		public void info(){
    			System.out.println("这个枚举值代表男性");
    		}
    	},
    	FEMALE("女"){
    		public void info(){
    			System.out.println("这个枚举值代表女性");
    		}
    	};
    	private final String name;
    	// 枚举类的构造器只能使用private修饰
    	private Gender(String name){
    		this.name = name;
    	}
    	public String getName(){
    		return this.name;
    	}
    	// 增加下面的info()方法,实现GenderDesc接口必须实现的方法
    	public void info(){
    		System.out.println("这是一个用于用于定义性别的枚举类");
    	}
    }
    
    • 以上就是由匿名子类实现的

    包含抽象方法的枚举类

    public enum Operation{
    	PLUS{
    		public double eval(double x , double y){
    			return x + y;
    		}
    	},
    	MINUS{
    		public double eval(double x , double y){
    			return x - y;
    		}
    	},
    	TIMES{
    		public double eval(double x , double y){
    			return x * y;
    		}
    	},
    	DIVIDE{
    		public double eval(double x , double y){
    			return x / y;
    		}
    	};
    	// 为枚举类定义一个抽象方法
    	// 这个抽象方法由不同的枚举值提供不同的实现
    	public abstract double eval(double x, double y);
    	public static void main(String[] args){
    		System.out.println(Operation.PLUS.eval(3, 4));
    		System.out.println(Operation.MINUS.eval(5, 4));
    		System.out.println(Operation.TIMES.eval(5, 4));
    		System.out.println(Operation.DIVIDE.eval(5, 4));
    	}
    }
    
  • 相关阅读:
    Effective Java 19 Use interfaces only to define types
    Effective Java 18 Prefer interfaces to abstract classes
    Effective Java 17 Design and document for inheritance or else prohibit it
    Effective Java 16 Favor composition over inheritance
    Effective Java 15 Minimize mutability
    Effective Java 14 In public classes, use accessor methods, not public fields
    Effective Java 13 Minimize the accessibility of classes and members
    Effective Java 12 Consider implementing Comparable
    sencha touch SortableList 的使用
    sencha touch dataview 中添加 button 等复杂布局并添加监听事件
  • 原文地址:https://www.cnblogs.com/cj5785/p/10664845.html
Copyright © 2011-2022 走看看