Java SomeEnum[]VAL=SomeEnum.values()变量在定义后是否会更改?
它在名称设置为“Lightspeed360”之前设置得很好,然后在定义后更改为它? 我很困惑,请解释/帮助。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
下面是我从运行上面看到的代码中获得的日志:
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");
}
}