Java:是否允许在运行时更改 Enum 字段?

ale*_*159 3 java enums

假设我有一个包含 BOB 和 ALICE 的枚举,并且我将他们的年龄存储在一个字段中。我可以在枚举中使用改变其年龄的方法吗?编译器似乎接受了它,但是有什么风险/这是不好的做法吗?例如:

public enum Friends {
    BOB(14),
    ALICE(22);

    private int age;

    private Friends(int age){
        this.age = age;
    }

    public void setAge(int age){
        this.age = age;
    }

    public int getAge(){
       return age;
    }
}
Run Code Online (Sandbox Code Playgroud)

dav*_*xxx 6

Java:是否允许在运行时更改 Enum 字段?

您无法更改枚举本身,但是您可以更改枚举值中定义的任何字段。

我可以在枚举中使用改变其年龄的方法吗?编译器似乎接受了它,但是有什么风险/这是不好的做法吗?

是的,你可以,但使用枚举似乎很笨拙。

枚举旨在表示“事物”的稳定且固定的枚举。
您可以将它们视为常量。
来自Oracle 文档

枚举类型是一种特殊的数据类型,它使变量成为一组预定义的常量。该变量必须等于为其预定义的值之一。常见示例包括罗盘方向(北、南、东、西的值)和星期几。

因为它们是常量,所以枚举类型的字段名称采用大写字母。

使用 Java 枚举,这些东西本身可以通过属性来描述。

当你定义枚举时,你会这样做:

public enum Friends {
    BOB(14),
    ALICE(22);

    private int age;

    private Friends(int age){
        this.age = age;
    }
Run Code Online (Sandbox Code Playgroud)

你的东西是朋友的,年龄是朋友的财产。
你的枚举的问题在于你的东西似乎不是稳定的东西:友谊是移动的东西,而你用来描述枚举的属性:age也不是稳定的东西。

在您的示例中,您的朋友看起来就像具有状态的实例。
因此,定义类(与 Enum 相对)来表示 Friends 并在客户端代码中实例化和修改它们似乎是表示和操作它们的更自然的方式。