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

标签 java

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

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

我习惯了 Vanilla 枚举声明,但我以前从未见过这种语法或模式。

您如何称呼这种模式,它是如何工作的,它有什么作用?

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

最佳答案

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

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

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

参见 tutorial由 Oracle 在枚举上。有关枚举的精确技术描述,请参阅 Java Language Specification , 具体来说 Chapter 8.9 Enum Classes .

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

关于Java 枚举声明包含成员和方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69969796/

相关文章:

java - 环境变量和@Value 不能在 Spring Boot 上协同工作

java - 如何在 JAX-RS Web 服务中返回 XML 格式的响应?

java - 正确处理 RxJava 中的空 Observable

java - 修复打开文件过多异常(我正在使用 try-catch-finally)

java - 我将创建两个java线程(一个线程用于乘数,另一个线程用于加数)

java - Android - 带有自定义 CursorAdapter 的 Listview,运行异步任务会崩溃

java - 如何将 JTable 选定的大量值行显示到一个 JText 区域中

java - 未找到 Spring @Autowired bean,未找到 [...] 类型的合格 bean

java - 无法使用 JAXB 解码 xml 文件

Java:无法在 JUnit 测试中读取数据文件