枚举,私人决赛String奇怪的行为

时间:2015-01-29 10:01:28

标签: java immutability

我经历过一种奇怪的行为。主要是,如果我将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;
    }
}

1 个答案:

答案 0 :(得分:3)

这对我来说就像是“不可能发生”的情景。

final未正确初始化的唯一半合理解释是与线程相关的问题。但是:

  • String值绝对是不可变且线程安全的,
  • 强烈保证final字段是线程安全的,并且
  • 此代码将作为enum的类初始化的一部分执行,并且也有相应的保证。

简而言之:它不是您向我们展示的代码中的线程问题。

这给我留下了奇怪的解释:

  • 有些东西使用讨厌的反射来修改字符串,
  • 使用讨厌的反射修改final字段或
  • 您没有运行您认为自己的代码;例如构建问题或者存在某种失控的“字节码工程”。

或者...... MessageUtils.getBundle在某些尚未确定的情况下返回错误的字符串。


  

这段代码可能有点误导,我不能只发布应用程序的整个代码。

或者......您的真实代码与此代码的某些重要方式不同。请提供一个简单的自包含完整示例(SSCCE),否则我们不太可能确定真正的问题。