Java Enumeration (枚举类型) (5) -- Value-specific class body

Java Enumeration (枚举类型) (5) -- Value-specific class body
什么是Value-specific class body呢?简而言之,就是不同的枚举常量 (enumeration constant)拥有自己的类定义,先看一个例子(这个例子的行为可以用更优雅的代码来实现,用它只是为了说明问题)
ArithmeticOp.java
package valspe;

public enum ArthmeticOp
{
    ADD(
1)
    {
        
        
//You will never be able to refer to this method
        
//outside this block
        public void onlyForAdd()
        {
            System.out.println(
"hey");
        }
        
        
public void showOperator()
        {
            System.out.println(
"+");
        }
        
        
public double compute(double x, double y)
        {
            
return (x+y);
        }
    },
    MINUS(
2)
    {
        
public void showOperator()
        {
            System.out.println(
"-");
        }
        
        
public double compute(double x, double y)
        {
            
return (x-y);
        }
    },
    TIMES(
3)
    {
        
public void showOperator()
        {
            System.out.println(
"*");
        }
        
        
public double compute(double x, double y)
        {
            
return (x*y);
        }
    },
    DIVIDE(
4)
    {
        
public void showOperator()
        {
            System.out.println(
"/");
        }
        
        
public double compute(double x, double y)
        {
            
return (x/y);
        }
    };
    
    ArthmeticOp(
int flag)
    {
        
this.flag = flag;
    }
    
    
public void showOperator()
    {
        System.out.println(flag);
    }
    
    
//Define a abstract method.You must implement this method
    
// in all the enumeration constants, or you will get a 
    
// compiler-time error
    public abstract double compute(double x, double y);
    
    
private int flag; // a useless field, just for demo
}

TestOperator.java
package valspe;

public class TestOpeator
{
    
public static void main(String [] args)
    {
        ArthmeticOp add 
= ArthmeticOp.ADD;
        System.out.println(add.compute(
12));
        add.showOperator();
        ArthmeticOp times 
= ArthmeticOp.TIMES;
        times.showOperator();
    }
}

  1. 定义每一个 value-specific class body (不知如何翻译~~)将会创建一个该枚举类型的匿名子类(anonymous subclass), 对应的枚举常量将会唯一的指向该子类。这里需要注意的是,尽管枚举类型不能被extends,但是它却可以拥有匿名子类,从这个意义上来说,枚举类型并不是一个严格的final类。
  2. 匿名子类就预示着这些子类没有自己的constructor,你也不能在你的代码中引用一些匿名子类自己拥有的方法或域(见上面例子ADD中的justForAdd方法),这是因为每个枚举类型的枚举常量的枚举类型都是该枚举类型的。可能这句话我表述的不好。举个例子,设有类 A, B是A的子类,B有一个自己的方法 bMethod()。在代码中,我先new一个B的实例b,然后再declare一个A的变量a,并让a指向b(a = b),这时,尽管a,b指向同一个对象,但你可以b.bMethod()却不能够a.bMethod()。
  3. 枚举类型可以定义abstract方法,但你必须至少定义一个枚举常量来实现这些abstract方法,否则将会产生编译错误。
  4. 由2可以看出,定义value-specific class body实际上就是实现枚举类型中的abstract方法或者override枚举类型种存在的方法。

你可能感兴趣的:(Java Enumeration (枚举类型) (5) -- Value-specific class body)