Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “设置”;常数;事后_Java_Android - Fatal编程技术网

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);
    }
};