java - 基于派生类在基类中以编程方式分配枚举值

标签 java enums

我有一个基类和两个派生类,它们似乎都使用相同的枚举。 我想在基类中使用枚举,但根据所使用的派生类的实例更改分配的值。 我该怎么做?

基类:

public class Base {
    private MyEnum data = MyEnum.Z;
    public Base() {

    }
    public void baseMethod() {
        System.out.println("base data:? "+MyEnum.X);
        data = MyEnum.Y;
        data.showVal();
        System.out.println("base value:? "+data);
    }
    //enum yet to be added
        protected enum MyEnum {
            X(0,2),
            Y(1,3),
            Z(4,5);
            private int a,b;
            MyEnum(int x, int y) {
                a=x;
                b=y;
            }
            public void showVal() {
                System.out.println("a="+a+",b="+b);
            }
        }
}

两个派生类:

public class A extends Base {
    private MyEnum data = MyEnum.Z;
    public A () {

    }
    public void firstMethod() {
        System.out.println("A's DATA: "+MyEnum.X);
        data = MyEnum.Y;
        data.showVal();
        System.out.println("A's value: "+data);
        baseMethod();
    }
        protected enum MyEnum {
           //values are different
            X(10,11),
            Y(12,13),
            Z(14,15);
            private int a,b;
            MyEnum(int x, int y) {
                a=x;
                b=y;
            }
            public void showVal() {
                System.out.println("a="+a+",b="+b);
            }
        }
}

public class B extends Base {
    private MyEnum data = MyEnum.Z;
    public B() {

    }
    public void secondMethod() {
        System.out.println("B'S DATA: "+MyEnum.X);
        data = MyEnum.Y;
        data.showVal();
        System.out.println("B's value: "+data);
        baseMethod();
    }
        protected enum MyEnum {
            //values are different
            X(20,21),
            Y(22,23),
            Z(24,25);
            private int a,b;
            MyEnum(int x, int y) {
                a=x;
                b=y;
            }
            public void showVal() {
                System.out.println("a="+a+",b="+b);
            }
        }
}

请帮忙。

最佳答案

Enums are basically final classes that you can't extend 。您可以在枚举中实现接口(interface),但不能扩展枚举来更改其方法之一或枚举的具体值(您所引用的一对整数)。

如果您想继续使用枚举,可以考虑的解决方案是使用带有 X、Y、Z 的单个 MyEnum 枚举,并添加 showVal (MyEnum value) 对象 BaseAB 中的方法。 showVal 方法只需将正确的整数对与所有枚举值(XYZ )。

以下是此方法的逻辑:

MyEnum.java

public enum MyEnum{
    X,Y,Z
}

Main.java

public class Main{

     public static void main(String []args){
        MyEnum value = MyEnum.X;

        System.out.println("With Base:");
        Base base = new Base();
        System.out.println(base.showVal(value));//prints "a=0,b=2"

        System.out.println("With A:");
        A a = new A();
        System.out.println(a.showVal(value));   //prints "a=10,b=11"

        System.out.println("With B:");
        B b = new B();
        System.out.println(b.showVal(value));   //prints "a=20,b=21"

     }
}

Base.java

public class Base{

    public Base(){
        //Do something...
    }

    public String showVal(MyEnum value){
        switch(value){
            case MyEnum.X:
                return "a=0,b=2";
            case MyEnum.Y:
                return "a=1,b=3";
            case MyEnum.Z:
                return "a=4,b=5";
        }

    }
}

A.java

public class A extends Base{

    public A(){
        //Do something...
    }

    @Override
    public String showVal(MyEnum value){
        switch(value){
            case MyEnum.X:
                return "a=10,b=11";
            case MyEnum.Y:
                return "a=12,b=13";
            case MyEnum.Z:
                return "a=14,b=15";
        }

    }
}

B.java

public class B extends Base{

    public B(){
        //Do something...
    }

    @Override
    public String showVal(MyEnum value){
        switch(value){
            case MyEnum.X:
                return "a=20,b=21";
            case MyEnum.Y:
                return "a=22,b=23";
            case MyEnum.Z:
                return "a=24,b=25";
        }

    }
}

如果您不介意更改结构,请使用对象来存储表示 XYZ 的状态。您将能够扩展该父对象并在子对象中提供您想要的任何整数部分。

关于java - 基于派生类在基类中以编程方式分配枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33922878/

相关文章:

java - 获取 JSON 作为输入时出现 MongoDB NULL 指针异常

java - 获取艺术家的唱片目录,就像 musicbrainz 上的概览页面一样

java - Java VM 上的 Android 错误。运行 Java SE 7

java - java中如何从Enum中获取值

Java Scanner.nextLine() 消耗换行符

java - Android 和 IOException - 奇怪的错误

javascript - 在 Typescript 中按字符串创建枚举实例

javascript - 验证(按位)一个值是否与枚举的多个特定标志匹配

java - 如何通过 Hibernate 将枚举字段设置为 Integer 到 db?

php - 枚举替代方案