Java 枚举获取程序返回错误的值

Java 枚举获取程序返回错误的值,java,enums,Java,Enums,我有一个枚举类型 public enum Type { A("abc1", "desc1"), B("abc2", "desc2"), C("abc3", "desc3"), D("abc4", "desc4"), E("abc5", "desc5"); private String value; private String description; privat

我有一个枚举类型

public enum Type {
        A("abc1", "desc1"),
        B("abc2", "desc2"),
        C("abc3", "desc3"),
        D("abc4", "desc4"),
        E("abc5", "desc5");

        private String value;
        private String description;

        private Type(String value, String description) {
            this.value = value;
            this.description = description;
        }

        public String getDescription() {
            return description;
        }

        public void setDescription(String description) {
            this.description = description;
        }

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }
    }
我通过以下代码从枚举中获取值

Type[] type = Type.values();

for (int i = 0; i < type.length; i++) {
    System.out.println(type[i].getValue());
}

但几天后,输出变为

abc1
abc2
abc1
abc4
abc5
如果我打印描述,那么它们总是正确的


我无法理解为什么Type.getValue()为枚举值C返回枚举值A的值。

您的枚举是可变的;有东西在调用
setValue()

您应该创建枚举-这样做很有意义。通过使字段为最终字段并舍弃setter使其不可变:

public enum Type {
    A("abc1", "desc1"),
    B("abc2", "desc2"),
    C("abc3", "desc3"),
    D("abc4", "desc4"),
    E("abc5", "desc5");

    private final String value;
    private final String description;

    private Type(String value, String description) {
        this.value = value;
        this.description = description;
    }

    public String getDescription() {
        return description;
    }

    public String getValue() {
        return value;
    }
}

}

你的枚举是可变的;有东西在调用
setValue()

您应该创建枚举-这样做很有意义。通过使字段为最终字段并舍弃setter使其不可变:

public enum Type {
    A("abc1", "desc1"),
    B("abc2", "desc2"),
    C("abc3", "desc3"),
    D("abc4", "desc4"),
    E("abc5", "desc5");

    private final String value;
    private final String description;

    private Type(String value, String description) {
        this.value = value;
        this.description = description;
    }

    public String getDescription() {
        return description;
    }

    public String getValue() {
        return value;
    }
}

}

你的枚举是可变的;有东西在调用
setValue()

您应该创建枚举-这样做很有意义。通过使字段为最终字段并舍弃setter使其不可变:

public enum Type {
    A("abc1", "desc1"),
    B("abc2", "desc2"),
    C("abc3", "desc3"),
    D("abc4", "desc4"),
    E("abc5", "desc5");

    private final String value;
    private final String description;

    private Type(String value, String description) {
        this.value = value;
        this.description = description;
    }

    public String getDescription() {
        return description;
    }

    public String getValue() {
        return value;
    }
}

}

你的枚举是可变的;有东西在调用
setValue()

您应该创建枚举-这样做很有意义。通过使字段为最终字段并舍弃setter使其不可变:

public enum Type {
    A("abc1", "desc1"),
    B("abc2", "desc2"),
    C("abc3", "desc3"),
    D("abc4", "desc4"),
    E("abc5", "desc5");

    private final String value;
    private final String description;

    private Type(String value, String description) {
        this.value = value;
        this.description = description;
    }

    public String getDescription() {
        return description;
    }

    public String getValue() {
        return value;
    }
}

}

“但几天后,输出更改为”-这让我笑了:)还有其他正在运行的线程吗?可变枚举感觉是个非常糟糕的主意。确保
value
final,删除setter。确保没有人调用
setValue()
?删除setValue(),并让我们知道它在几天内是否工作。“但几天后,输出更改为”-这让我发笑:)还有其他正在运行的线程吗?可变枚举感觉是一个非常糟糕的主意。确保
value
final,删除setter。确保没有人调用
setValue()
?删除setValue(),并让我们知道它在几天内是否工作。“但几天后,输出更改为”-这让我发笑:)还有其他正在运行的线程吗?可变枚举感觉是一个非常糟糕的主意。确保
value
final,删除setter。确保没有人调用
setValue()
?删除setValue(),并让我们知道它在几天内是否工作。“但几天后,输出更改为”-这让我发笑:)还有其他正在运行的线程吗?可变枚举感觉是一个非常糟糕的主意。确保
value
final,删除setter。确保没有人调用
setValue()
?删除setValue(),并告知它在几天内是否有效。