美文网首页
枚举enum实现抽象方法

枚举enum实现抽象方法

作者: 哈密朵 | 来源:发表于2019-07-06 21:45 被阅读0次

这是一个常见的枚举类,枚举由成员属性和成员方法组成,偶尔有静态方法,静态方法用来遍历所有实例,判断实例的成员属性值等。枚举第一排就是各个单例实例,配合private构造函数把入参值构造给成员属性上。
字节码层面,这个普通的枚举是final class:

public final class com.xxx.AreaType extends java.lang.Enum<com.xxx.AreaType>
public enum AreaType {
    OUTER("0", "内"), INNER("1", "外");

    private String type;
    private String name;

    AreaType(String type, String name) {
        this.type = type;
        this.name = name;
    }

    public String getType() {return type;}
    public String getName() {return name;}

    public static AreaType typeOf(String type) {
        for (AreaType areaType: AreaType.values()) {
            if (areaType.type.equals(type)) {
                return areaType;
            }
        }
        return null;
    }
}

成员方法是直接使用成员属性比如type和name计算得到返回结果,静态方法是遍历各个实例使用其成员属性计算得到返回结果,方法过程都是根据成员属性进行计算。
如果我们想让各个实例拥有完全不一样的方法实现,不依赖于成员属性,有三种方式:
1)定义抽象方法,实例使用{...}匿名块,在匿名块中实现抽象。

OUTER("0", "区域内") {
    @Override
    public Date elapseDate(Date date, int quantity) {
        return DateUtils.addDays(date, quantity);
    }
}
public String getType() {return type;}
public String getName() {return name;}
public abstract Date elapseDate(Date date, int quantity);

字节码层面,定义了抽象方法后,则枚举类在字节码层面是abstract class,各个单例实例加上了匿名实现块{...} 之后变成了final 子class。

public abstract class com.xxx.AreaType extends java.lang.Enum<com.xxx.AreaType>

第一个实例OUTER:

final class com.xxx.AreaType$1 extends com.xxx.AreaType

2)定义额外的接口,枚举实现接口,各个实例使用{...}匿名块,在匿名块中实现接口。

public enum AreaType implements IDateHandler {
    OUTER("0", "区域内") {
        @Override
        public Date elapseDate(Date date, int quantity) {
            return DateUtils.addDays(date, quantity);
        }
    }
    public String getType() {return type;}
    public String getName() {return name;}
}

字节码层面跟抽象方法类似,多了一个接口定义

public abstract class com.xxx.AreaType extends java.lang.Enum<com.xxx.AreaType> implements com.xxx.IDateHandler

第一个实例OUTER:

final class com.xxx.AreaType$1 extends com.xxx.AreaType

3)成员属性增加一个接口引用,在调用构造函数时,填入一个匿名接口实现或一个表达式,新建成员方法,内部使用接口成员属性去执行一系列处理。

OUTER("0", "区域内", (date, quantity) -> DateUtils.addDays(date, quantity));

private String type;
private String name;
private IDateHandler handler;

AreaType(String type, String name, IDateHandler handler) {
    this.type = type;
    this.name = name;
    this.handler = handler;
}

public String getType() {return type;}
public String getName() {return name;}
public Date handleDate(Date date, int quantity) {
    return handler.elapseDate(date, quantity);
}

相关文章

  • 枚举enum实现抽象方法

    这是一个常见的枚举类,枚举由成员属性和成员方法组成,偶尔有静态方法,静态方法用来遍历所有实例,判断实例的成员属性值...

  • Java枚举

    枚举 普通方式定义(int枚举模式) 枚举方式 Enum抽象类常见方法 Enum是所有 Java 语言枚举类型的公...

  • Java枚举

    枚举普通使用所有定义的枚举类型均继承至抽象类Enum,Enum的构造方法是私有化的,只有编译器可以调用。 输出 枚...

  • <转> 通过枚举 enum 来实现单例模式

    转自:通过枚举 enum 来实现单例模式 枚举 通过enum关键字来实现枚举,在枚举中需要注意的有: 枚举中的属性...

  • Enum枚举类的认识

    枚举类:默认继承java.lang.Enum类,不能再继承其他类,但是可以实现一个或多个接口。不是个抽象类。 枚举...

  • 枚举--java24(02/17/2016)

    如何自定义枚举类如何使用enum定义枚举类、枚举类的主要方法实现接口的枚举类 JDK1.5之前需要自定义枚举类JD...

  • 枚举

    定义枚举类 可以在枚举中定义普通方法和抽象方法. 也同样可在枚举类中定义属性,构造方法. 实现原理 Java文件在...

  • 枚举

    一、概念: 实例有限而且固定的类,在java里被称为枚举类。 二、通过enum实现枚举类 使用enum定义的枚举类...

  • Swift枚举和结构体(Enumerations and Str

    不错的参考: Enum进阶 使用enum创建枚举,像类和其他所有类型那样,枚举可以有方法,供访问。 再看一个枚举...

  • Java 枚举enum构造方法默认是private

    Java 枚举enum构造方法默认是private

网友评论

      本文标题:枚举enum实现抽象方法

      本文链接:https://www.haomeiwen.com/subject/atwmhctx.html