我经历过一种奇怪的行为。主要是,如果我将longName和iconPath声明为私有final String,有时会发生这些字段值被破坏,它们具有除预期之外的其他值。
但是,如果我将变量类型更改为private final Pair<String, String> data;
它可以正常工作,ArrayList也可以完成这项工作。可能是什么原因?
我猜String变量,由于最后一个术语是不可变的(尽管它确实改变了它的值)。
package package.enums;
import package.MessageUtils;
public enum QuestionType {
SIMPLE (
MessageUtils.getBundle("survey.question.type.SIMPLE"),
"/resources/images/question_default.png"
),
COMPLEX (
MessageUtils.getBundle("survey.question.type.COMPLEX"),
"/resources/images/question_default.png"
)
// etcetera
;
private final String longName;
private final String iconPath;
private QuestionType(String longName, String iconPath) {
this.longName = longName;
this.iconPath = iconPath;
}
public String getLongName() {
return longName;
}
public String getIconPath() {
return iconPath;
}
}
答案 0 :(得分:3)
这对我来说就像是“不可能发生”的情景。
final
未正确初始化的唯一半合理解释是与线程相关的问题。但是:
String
值绝对是不可变且线程安全的,final
字段是线程安全的,并且enum
的类初始化的一部分执行,并且也有相应的保证。简而言之:它不是您向我们展示的代码中的线程问题。
这给我留下了奇怪的解释:
final
字段或或者...... MessageUtils.getBundle
在某些尚未确定的情况下返回错误的字符串。
这段代码可能有点误导,我不能只发布应用程序的整个代码。
或者......您的真实代码与此代码的某些重要方式不同。请提供一个简单的自包含完整示例(SSCCE),否则我们不太可能确定真正的问题。