public class Test {
private int var1 = 1;
// These are the troublesome lines
public String[] name = new String[10];
// Use a constructor for initialization or
// declare the string array as public String[] name = {"Mary" };
public Test() {
name[0] = "Mary"; // When I remove this line, both the errors go away
}
public int var2 = 10;
}
Javaでは、ステートメントをメソッド/ブロックに配置する必要があります。
例えば
public class TestB {
public String[] s = new String[10];
{
s[0] = "10";
}
}
実際には合法です(ただし、静的メンバーを除いて、使用しません)
編集:静的メンバーに関する説明
多くの場合、純粋な静的オブジェクトを使用する必要があります。そのような場合、初期化を提供する簡単な方法は、匿名の静的ブロックを使用することです。何かのようなもの:
public class TestStatic {
private String [] someStaticStringArray = new String [10];
static {
someStaticStringArray[0] = "foo";
someStaticStringArray[1] = "bar";
}
// Or better with static HashMaps
private static HashMap<String, String> hm = new HashMap<String, String>();
static {
hm.put("key", "val");
hm.put("key2", "val2");
hm.put("key3", "val3");
}
}
静的データメンバーの場合、ファクトリメソッドまたはファクトリオブジェクトを提供する方法がない場合は、この方法を使用します。非静的データメンバーの場合、匿名ブロックが機能する場合でも、コンストラクターを使用することをお勧めします。
Javaで初期化を提供する方法はたくさんありますが、個人的な好みがどちらかを選択する主な理由だと思います。
あなたの特定の状況のために、私はこのようなものを選びます:
public class TestC {
// Static data member, constructor does not read data from XML
private static YourDataObject obj = new YourDataObject();
public static YourDataObject getInstance(String xmlFile) {
// Read XML file
// Actually initialize the instance
obj.set...(); //
// return the instance
return obj;
}
}