除了覆盖之外,还使用向 Java 中的枚举案例添加函数/字段吗?

Jil*_*sin 4 java enums

偶然我发现 Java 1.8 编译器允许使用以下语法:

enum AnimalType {
    DOG {
        @Override
        public String toString() {
            return "I am a dog";
        }
    },
    CAT {
        @Override
        public String toString() {
            return "I am a cat";
        }

        public void doCatThings() {
            // ...
        }
    },
}
Run Code Online (Sandbox Code Playgroud)

单独覆盖toString()效果非常好。AnimalType.DOG对字符串的调用结果为“我是一只狗”。

除此之外,我找不到任何有关此枚举案例自定义的用途的信息。请注意该案例的其他公共方法CAT。当定义任何其他公共方法或字段时,似乎无论如何都无法从外部访问它。

那么这到底是怎么回事呢?这是否只是技术上正确的语法但毫无意义的东西?

Mar*_*nik 5

toString继承自 Object,但行为仍然是多态的:DOG 和 CAT 以不同的方式“打印自己”。现在,如果您在枚举定义sound()级别使用抽象方法,那么您自己的自定义方法(如以下示例)将更有意义:AnimalType

enum AnimalType {
    DOG {
        @Override
        public String toString() {
            return "I am a dog";
        }

        @Override
        public void sound() {
           System.out.println("Meowww");
        }
     
    },
    CAT {
        @Override
        public String toString() {
            return "I am a cat";
        }

        @Override
        public void sound() {
           System.out.println("Woof, I'm a barking dog");
        }
    };

    abstract void sound();
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以向枚举添加多态自定义行为并在不知道实际动物的情况下使用它:


public class SampleClass {

    public static void doSound(AnimalType animal) {
       ...
       animal.sound();
    }
}

// usage:

SampleClass.doSound(AnimalType.DOG);

Run Code Online (Sandbox Code Playgroud)

实际用法可能会有所不同,在我的脑海中,您可以实现有限状态机,解析枚举是否是令牌,计算枚举是否是几何图形(例如计算 3D 图形的体积)等等。它是像其他许多 Java 程序员一样的工具。明智地使用它:)