栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何为枚举项定义属性

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何为枚举项定义属性

简短答案

您需要一个构造函数,一个字段和一个吸气剂。

建设者

枚举类型可以具有构造函数,只要它们的访问级别为私有或默认(包私有)即可。除了枚举声明本身之外,您不能直接调用这些构造函数。与类相似,当定义不带参数的枚举常量时,实际上是调用由编译器生成的默认构造函数。例如

public enum King {    ELVIS}

相当于

public enum King {    ELVIS() // the compiler will happily accept this}

就像在类中一样,如果您定义显式构造函数,则编译器将不会插入默认构造函数,因此将无法编译:

public enum King {    ELVIS, // error, default constructor is not defined    MICHAEL_JACKSON(true)    ;    private boolean kingOfPop;    King(boolean kingOfPop){this.kingOfPop = kingOfPop;}}

这是一个很好的枚举参考,也解释了构造函数的问题。

字段和访问者

枚举是常量,因此是不可变的。但是,他们可以定义可以具有状态的字段。这是一个可怕的做法,因为开发商会希望枚举和它们相关联的值是常量,但你 可以
仍然与getter和setter枚举定义一个非最终场。

这是合法的Java代码:

public enum Color {    RED("FF0000"),    GREEN("00FF00"),    BLUE("0000FF");    private String pre;    public String getCode(){return pre;}    public void setCode(String pre){this.pre = pre;}    private Color(String pre){this.pre = pre;}}

但是它启用了这样的邪恶代码:

String oldBlue = Color.BLUE.getCode();Color.BLUE.setCode(Color.RED.getCode());Color.RED.setCode(oldBlue);

因此,在99.99%的情况下:如果枚举中包含字段,则应将它们定型并仅提供吸气剂。如果字段本身不是一成不变的,请提供防御性副本:

public enum Band {    THE_BEATLES("John","Paul","George","Ringo");    private final List<String> members;    public List<String> getMembers(){        // defensive copy, because the original list is mutable        return new ArrayList<String>(members);    }    private Band(String... members){        this.members=Arrays.asList(members);    }}

在您的情况下,这非常简单:您只需要一个字符串类型的字段(不可变),因此在构造函数中对其进行初始化并提供getter完全可以:

public enum Checker {    EMPTY ("Empty"),    RED ("Red"),    YELLOW ("Yellow");    private final String value;    private Checker(final String value) {        this.value = value;    }    public String getValue() { return value; }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/569558.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号