java - 枚举值的子类化

标签 java inheritance enums

我希望能够对枚举中的某些值进行子类化,这样我就不必过多地重复代码。有什么办法可以做到这一点?这是我想要实现的目标的示例,Eclipse 很快告诉我这是一个令人厌恶的事情:

public enum Foo {
    BAR {
        @Override
        public void taskA() {
            System.out.println("A");
        }

        @Override
        public void taskB() {}
    },
    BAZ extends BAR {
        @Override
        public void taskB() {
            System.out.println("B");
        }
    };

    public abstract void taskA();
    public abstract void taskB();
}

BAR 将只有 taskA 的实现和一个空的 taskB,而 BAZ 将同时拥有这两种方法- BARtaskA 实现,以及它自己的 taskB 实现。

枚举声明后我没有改变它的值,为什么这不起作用?我可以在 BAZ 中调用 BARtaskA 方法,为什么我不能这样做?

最佳答案

I want to be able to subclass some values in an enum, in order that I don't have to repeat code too much.

在常量特定方法之间共享代码的常用方法是声明一个私有(private)静态方法(在枚举本身或实用程序帮助类中),其中包含您希望从常量特定方法访问的公共(public)代码.

例如……

public enum Foo {
    BAR {
        @Override
        public void taskA() {
            commonToTaskAandB();
            System.out.println("B"); 
       }

        @Override
        public void taskB() {}
    },
    BAZ {
        @Override
        public void taskB() {
            commonToTaskAandB();
            System.out.println("B");
        }
    };

    public abstract void taskA();
    public abstract void taskB();

    private static void commonToTaskAandB() {
        // shared code here
        :
        :
    }

}

请注意,代码“BAZ extends Bar”是非法的,因为 BAZ 不是一种类型。 BAZ 是您的 Enum<Foo> 的一个实例类型。一个实例不能扩展另一个类型。将面向对象的原则(如继承)应用于枚举常量是不正确的,因为在 Java 中,枚举常量是类的实例,而不是类本身。

关于java - 枚举值的子类化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35107596/

相关文章:

Java:编译时的枚举值?

java - 最终变量和匿名类的变量可能尚未初始化

java - 从文件中读取字符串和原始数据类型并创建对象

inheritance - 无法在 JPA 中使用带有策略 TABLE_PER_CLASS 的身份列键生成?

Javascript继承思想(二)

enums - 在 OpenAPI (Swagger) 中重用枚举的子集

java - 泛型类型 java 不接受原语 int

java - Maven 循环依赖解析

c# - 什么是阅读 ISomething : ISomethingElse 的正确方法

java - JSON 模式到 POJO - 枚举作为一个单独的 java 文件