繁体   English   中英

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

[英]Java enum declaration contains members and methods

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

有一个类声明。 并且在类声明中声明了一个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

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

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

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

请参阅 Oracle 关于枚举的 教程

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

Java 中的enum只是一个具有其类型常量的类。 这意味着枚举A将包含类型 A 的常量。

这个枚举EscapeMode有一个私有数据成员 map 和一个构造函数来初始化map getter getMap()返回map

xhtmlbaseextended是由逗号分隔并以分号结尾的常量。 由于它们是EscapeMode对象, EscapeMode您需要将Map对象传递给构造函数以初始化它们。 xhtmlByVal被传递给构造函数以初始化xhtml ,依此类推。

此功能为enum对象带来了属性和行为。 枚举就像任何其他类一样,但继承了java.lang.Enu m 类

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM