尽管我们已经为每个常量使用了不同的方法,但为什么我们仍需要枚举常量方法之外的方法?

时间:2019-02-06 12:40:12

标签: java function enums abstract

我试图通过对所有常量使用函数并为每个常量定义函数来制作enum,例如说出颜色GREEN等的信息,但是为什么我需要定义相同的抽象函数,尽管对于enum的每个常量我已经有单独的函数。

enum color {
    GREEN {
        public void info() {
            System.out.println("Dangerous Color: GREEN");
        }   
    },
    RED {
        public void info() {
            System.out.println("Dangerous Color");
        }
    },
    BLUE {  
        public void info() {
            System.out.println("Ordinary universal colour: BLUE");
        }    
    };         
      public void info() { System.out.println("Ordinary universal colour"); }         
    public abstract void info();    
}   
public class EnumDemo4 {    
    public static void main(String[] args) {    
        color[] c = color.values();
        for (color c1 : c) {
            System.out.println(c1);
            c1.info();    
        }
    }    
}

尽管每个常量我们已经有不同的方法,为什么我们还需要enum常量方法之外的方法?

尽管我们已经为各个常量定义了函数,但为什么还需要添加抽象或非抽象方法呢?

1 个答案:

答案 0 :(得分:0)

首先,您的代码无法编译。您不能在同一枚举中两次定义info()

此行必须删除: public void info() { System.out.println("Ordinary universal colour"); }

无论如何,您希望它什么时候起作用?它与任何颜色都没有关联。

正确的定义如下:

enum Color {
    GREEN {
        @Override
        public void info() {
            System.out.println("Dangerous Color: GREEN");
        }   
    },
    RED {
        @Override
        public void info() {
            System.out.println("Dangerous Color");
        }
    },
    BLUE {  
        @Override
        public void info() {
            System.out.println("Ordinary universal colour: BLUE");
        }    
    };         

    public abstract void info();    
}   

之所以需要在枚举级别定义abstract void info()的原因是,您想强制枚举中的所有常量提供该常量。保证所有枚举实例都将提供它,因此c1.info()函数中的行main()可以正常工作。

如果您尝试删除abstract void info(),则您的常量会巧合地 每个都实现了info(),但是没有告诉编译器在Color枚举中级别,您将永远拥有它。因此它将无法编译。

如果您想要一个稍微不那么庞大的定义,则可以像这样更改它,其作用相同:

enum Color {
    GREEN("Dangerous Color: GREEN"),
    RED("Dangerous Color"),
    BLUE("Ordinary universal colour: BLUE");

    private final String info;

    Colour(String info) {
      this.info = info;
    }

    public void info() {
       System.out.println(info);
    }    
}