Java SomeEnum[]VAL=SomeEnum.values()变量在定义后是否会更改?

Java SomeEnum[]VAL=SomeEnum.values()变量在定义后是否会更改?,java,enums,Java,Enums,它在名称设置为“Lightspeed360”之前设置得很好,然后在定义后更改为它? 我很困惑,请解释/帮助。 下面是我从运行上面看到的代码中获得的日志: PlayerDefaults[] pds; if (pds == null) { pds = PlayerDefaults.values(); } PlayerDefaults.Name.value = "Lightspeed360"; 示例PlayerDefaults.Name中PlayerDefaults中的每个枚举如下 TES

它在名称设置为“Lightspeed360”之前设置得很好,然后在定义后更改为它? 我很困惑,请解释/帮助。

下面是我从运行上面看到的代码中获得的日志:

PlayerDefaults[] pds;
if (pds == null)
{
    pds = PlayerDefaults.values();
}
PlayerDefaults.Name.value = "Lightspeed360";

示例PlayerDefaults.Name中PlayerDefaults中的每个枚举如下

TEST BEFORE> $Name$
TEST BEFORE> 2000
TEST BEFORE> 0
TEST AFTER> Lightspeed360
TEST AFTER> 2000
TEST AFTER> 0
因此,无论何时访问PlayerDefaults.Name,都会得到相同的对象

有关如何使用enum的更多详细信息,我建议您阅读“有效Java”第6章

编辑: 之所以可以直接在DataDefaults内访问PlayerDefaults.Name.value,是因为PlayerDefaults是DataDefaults的内部枚举。 可以将每个PraseRebug视为数据错误的静态成员。
由于整个类都在您的控制之下,因此您有责任不更改PlayerDefaults字段的任何值。

您的枚举值不更改

只是那些枚举值(您碰巧将其命名为
value
)的一些成员变量正在更改。从设计的角度来看,这不是一件好事,但它是合法的

您将无法以这种方式向枚举添加项-这将破坏枚举契约

事实上,枚举很像Java中的类。有些人甚至喜欢他们的单身(虽然这不是最好的想法)。所以你可以有成员变量,方法和很多其他的东西。但是您总是只有有限数量的项,即在enum声明开始时枚举的项

检查对调试输出的此更改:

public static final PlayerDefaults Name = new PlayerDefaults();
您仍然会得到相同的枚举对象,它们由其
名称()唯一标识

编辑您的问题

那么:

    for (PlayerDefaults pd : pds)
    {
        System.out.println("Name before> " + pd.name());
        System.out.println("TEST BEFORE> " + pd.value);
    }
    PlayerDefaults.Name.value = name;
    for (PlayerDefaults pd : pds)
    {
        System.out.println("Name after> " + pd.name());
        System.out.println("TEST AFTER> " + pd.value);
    }
因此,现在如果需要重置枚举,可以这样做但是这叫“我不是线程安全的”。如果当您将其设置为一个值时,另一个线程中的其他线程会重置

最好在代码中保留
映射
,并限制
PlayerDefaults
仅表示默认值的名称,而不表示值

使用地图的示例

考虑此示例,仅在初始化贴图时使用以下值:

public static enum PlayerDefaults
{

    Name("$Name$"),
    Money(2000),
    Warnings(0);

    public static void reset() {
        Name.value = "$Name";
        Money.value = 2000;
        Warnings.value = 0;
    }
import java.util.HashMap;
导入java.util.Map;
公共类数据默认值
{
Map playerData=new HashMap();
公共数据默认值(最终字符串名称){
if(playerData.isEmpty())
对于(PlayerDefaults pd:PlayerDefaults.values()){
playerData.put(局部放电,局部放电值);
}
playerData.put(PlayerDefaults.Name,Name);
}
无效关闭(){
对于(Map.Entry:playerData.entrySet()){
System.out.println(entry.getKey().name()+“:”+entry.getValue());
}
}
公共静态枚举PlayerDefaults{
名称($Name$),
货币(2000年),
警告(0);
私人客体价值;
private PlayerDefaults(对象值){
这个值=值;
}       
对象getValue(){
返回值;
}
}
公共静态void main(字符串[]args){
新数据默认值(“WTF”);
}
}

你能多分享一些代码吗?喜欢PlayerDefaults的类定义以及如何检查它的更改?在设置名称之前,我有一个循环通过数组,然后在设置数组之后,我看到它在设置名称之后更改为名称?我无法从中反编译代码。请分享。在“一些测试代码”下添加了我对描述差异的看法。您的第一段代码无法编译。因为有明确的赋值,所以不能将未初始化的局部变量与null进行比较。如果希望整个类都在这里,我不完全理解您的意思:一般来说,它不允许任何人更改枚举中字段的值。问题是我以前做过一些工作,但是,不是我想要的,所以我删除了它,现在无法让它再次工作。那么有没有其他方法“重置”我的枚举?是的,它会在值(我不知道正确的名称)设置之前显示名称。你能解释一下你的编辑吗?哪部分需要更多解释?重置还是地图?我没看到第二次编辑给我一点时间。好的,是的,我可以这样重置它,但是,我想让所有值保存它们,然后当我完成后,将枚举中的所有值设置为我上面所说的首先保存的值。好的,我在hashmap中得到$Name$,但是,它有点不稳定,当在枚举中它的名称>金钱>警告时,它会变成名称>警告>金钱,但我修复了它。
import java.util.HashMap;
import java.util.Map;

public class DataDefaults
{

    Map<PlayerDefaults, Object> playerData = new HashMap<PlayerDefaults,Object>();

    public DataDefaults(final String name)  {
        if (playerData.isEmpty())
        for (PlayerDefaults pd : PlayerDefaults.values()) {
            playerData.put(pd, pd.value);           
        }
        playerData.put(PlayerDefaults.Name, name);      
    }

    void close() {
        for(Map.Entry<PlayerDefaults, Object> entry : playerData.entrySet()) {
            System.out.println(entry.getKey().name() + ": " + entry.getValue());
        }
    }

    public static enum PlayerDefaults { 
        Name("$Name$"),
        Money(2000),
        Warnings(0);

        private Object value; 
        private PlayerDefaults(Object value) {
            this.value = value;
        }       

        Object getValue() {
            return value;
        }
    }

    public static void main(String[] args) {
        new DataDefaults("WTF");
    }
}