Java “设置”;常数;事后
我想在开始常数后设置最后一个变量。如果变量不是Java “设置”;常数;事后,java,android,Java,Android,我想在开始常数后设置最后一个变量。如果变量不是final,则此操作有效,但这样做会破坏目的 我可以做类似的事情吗 我的情况: public static JSONArray CATEGORIES = null; { String str = ""; str += "\"" + FIRST_CATEGORY + "\""; try { CATEGORIES = new JSONArray("[" + str + "]"); } catch (JSO
final
,则此操作有效,但这样做会破坏目的
我可以做类似的事情吗
我的情况:
public static JSONArray CATEGORIES = null;
{
String str = "";
str += "\"" + FIRST_CATEGORY + "\"";
try {
CATEGORIES = new JSONArray("[" + str + "]");
} catch (JSONException e) {
e.printStackTrace();
}
};
您可以使用静态初始化块-至少,您可以在常规JavaSE中使用(我假设android也可以): 请注意,您并不是首先将
类别初始化为null,而是在静态块出现之前将其保持未初始化状态
尽管如此,如果初始化生成异常,您可能会希望硬失败,因为否则您将有一个未正确初始化的变量(可能会出现严重问题)。
而且,除非JSONArray
类是不可变的,否则声明实例final
几乎毫无意义。您可以选择在变量声明中不包含“=null”。只要确保给变量赋值一次——不管是在if-else、循环中还是其他任何地方——编译器就会检测到您是否违反了这条规则,并且不会让您的程序编译
public static JSONArray CATEGORIES = null;
{
String str;
str += "\"" + FIRST_CATEGORY + "\"";
try {
CATEGORIES = new JSONArray("[" + str + "]");
} catch (JSONException e) {
e.printStackTrace();
}
};
我明白了。我不确定这里到底发生了什么,但它起作用了
public static final JSONArray CATEGORIES = new JSONArray() {
{
put(FIRST_CATEGORY);
// etc eg. put(SECOND_CATEGORY);
}
};
嘎,太近了。是的,硬失败是不可能的。@Jackson-然后你必须写一些检测代码,因为实例的状态——包括实际对象和对它的引用——是未定义的(如果我记得正确的话)。我想出了一个解决方案。我不知道它是如何工作的,也不知道它为什么工作,但它与您的类似,没有错误。您正在创建一个匿名子类。最常见的例子可能是Listener
子类(通常)是如何在Swing中实现的。另外,请注意,任何人只要引用了类别
,就可以随时(对每个人)修改它(假设放置
不是私有的
)-这可能不是您想要的。您可能希望考虑实例<代码>私下<代码>,然后使用复制的吸气剂。
public static JSONArray CATEGORIES = null;
{
String str;
str += "\"" + FIRST_CATEGORY + "\"";
try {
CATEGORIES = new JSONArray("[" + str + "]");
} catch (JSONException e) {
e.printStackTrace();
}
};
public static final JSONArray CATEGORIES = new JSONArray() {
{
put(FIRST_CATEGORY);
// etc eg. put(SECOND_CATEGORY);
}
};