Java 枚举声明包含成员和方法

sel*_*bie 2 java

我在如下所示的一些开源代码(旧版本的 JSoup)中遇到了以下 Java 代码。

有一个类声明。在类声明中是一个enum声明。但枚举似乎更像是一个类似类的声明,具有构造函数方法、私有成员和公共方法。声明的实际枚举值是使用父类的静态成员进行初始化的。

我习惯了普通的枚举声明,但我以前没有见过这种语法或模式。

您如何称呼这种模式,它是如何工作的,它能实现什么?

public class Entities {
    public enum EscapeMode {
        /** Restricted entities suitable for XHTML output: lt, gt, amp, and quot only. */
        xhtml(xhtmlByVal),
        /** Default HTML output entities. */
        base(baseByVal),
        /** Complete HTML entities. */
        extended(fullByVal);

        private Map<Character, String> map;

        EscapeMode(Map<Character, String> map) {
            this.map = map;
        }

        public Map<Character, String> getMap() {
            return map;
        }
    }

    private static final Map<String, Character> full;
    private static final Map<Character, String> xhtmlByVal;
    private static final Map<String, Character> base;
    private static final Map<Character, String> baseByVal;
    private static final Map<Character, String> fullByVal;

    private Entities() {}

    // remaining code not shown for brevity

Run Code Online (Sandbox Code Playgroud)

Bas*_*que 6

Java中的枚举只是类,一种特殊的类,但仍然是一个类。

所以,是的,枚举可以有构造函数、成员字段和方法。

从技术上讲,所有 Java 枚举都是该类的隐式子类java.lang.Enum。这就是为什么枚举不能从您选择的类扩展的原因;枚举已经从Enum.

请参阅Oracle 关于枚举的教程。有关枚举的精确技术描述,请参阅Java 语言规范,特别是第 8.9 章枚举类

顺便说一句,Java 16 为枚举带来了一个方便的新功能:您可以在本地声明枚举作为实现记录工作的一部分,我们现在可以在本地声明枚举、接口和记录。