事后设定“常数”

时间:2011-11-01 16:38:08

标签: java android

我想在启动常量后设置最终变量。如果变量不是final,那么这种方法有效,但这种方法会失败。

我可以为此做一些类似的吗?

public static final String ASDF = null; 
{
    ASDF = "asdf";
}

我的情况:

public static JSONArray CATEGORIES = null; 
{
    String str = "";
    str += "\"" + FIRST_CATEGORY + "\"";
    try {
        CATEGORIES = new JSONArray("[" + str + "]");
    } catch (JSONException e) {
        e.printStackTrace();
    }
};

3 个答案:

答案 0 :(得分:3)

你可以使用一个静态初始化块 - 至少,你可以在常规的Java SE中(我也可以安慰android):

public static final JSONArray CATEGORIES;
static {
    String str = "\"" + FIRST_CATEGORY + "\"";
    try {
        CATEGORIES = new JSONArray("[" + str + "]");
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

请注意,您不是先将CATEGORIES初始化为null,而是在静态块发生之前保持未初始化。

虽然如果初始化产生异常,你可能会想要难以理解,否则你将有一个不正确的初始化变量(可能出现严重问题)。
并且,除非JSONArray类是不可变的,否则声明实例final是有点无意义的。

答案 1 :(得分:1)

想出来。我不确定这里发生了什么,但它确实有效。

public static final JSONArray CATEGORIES = new JSONArray() {
    {
        put(FIRST_CATEGORY);
        // etc eg. put(SECOND_CATEGORY);
    }
};

答案 2 :(得分:0)

您可以选择不在变量声明中包含“= null”。只需确保为变量赋值一次 - 无论是在if-else,循环还是其他内部 - 编译器将检测您是否违反此规则,并且不会让您的程序编译。

public static JSONArray CATEGORIES = null; 
{
    String str;
    str += "\"" + FIRST_CATEGORY + "\"";
    try {
        CATEGORIES = new JSONArray("[" + str + "]");
    } catch (JSONException e) {
        e.printStackTrace();
    }
};