我想在启动常量后设置最终变量。如果变量不是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();
}
};
答案 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();
}
};