簡體   English   中英

枚舉,私有最終字符串奇數行為

[英]Enum, private final String odd behaviour

我經歷了奇怪的行為。 主要是,如果我將longName和iconPath聲明為私有最終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;
    }
}

在我看來,這是“不可能發生”的情況。

對於final未正確初始化的唯一半合理的解釋是與線程相關的問題。 然而:

  • String值絕對是不可變的並且是線程安全的,
  • 有力保證final字段是線程安全的,並且
  • 該代碼將作為enum類初始化的一部分執行,並且對此也有保證。

簡而言之:在您展示給我們的代碼中,它不可能是線程問題。

這給我留下了奇怪的解釋,例如:

  • 有些東西正在使用討厭的反射來修改字符串,
  • 某些東西正在使用討厭的反射來修改final字段,或者
  • 您沒有運行您認為自己的代碼; 例如構建問題或發生某種失控的“字節碼工程”。

還是...在某些尚待確定的情況下, MessageUtils.getBundle返回錯誤的字符串。


這段代碼可能有點誤導,我不能僅僅發布應用程序的整個代碼。

或者...您的真實代碼在某些重要方面不同於此代碼。 請提供一個簡單的自包含完整示例(SSCCE),否則我們不太可能確定真正的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM