クラス スコープでフィールドをインスタンス化できるのに、それらのフィールドでメソッドを呼び出すことができないのはなぜですか?
public class MethodInFieldTest {
List<Object> list = new ArrayList<>();
// compilation error
// list.add(new Object());
// Compiles just fine, how I usually do it
{
list.add(new Object());
}
// compilation error
// addObject();
public void addObject() {
list.add(new Object());
}
//usual way of handling this
//constructor one
public MethodInFieldTest(... stuff) {
list.add(new Object());
}
//constructor two
public MethodInFieldTest(..) {
list.add(new Object());
}
//etc
//...
//ugly way of doing it
// List<Object> list = new ArrayList<>(Arrays.asList(new Object[]{new Object(), new Object()}));
public static void main(String[] args) {
System.out.println(new MethodInFieldTest().list);
}
}
たとえば、いくつかのデフォルト値でリストを開始するのが理にかなっていることがよくあります。クラスに複数のコンストラクターがある場合は、コンストラクターにデフォルト値を追加するか、コードで以下に示す醜い方法を使用する必要があります。「醜い」方法はリストに対しては機能しますが、クラスのデフォルト状態 (オブジェクトコンストラクターによって提供されない状態) を必要とする他のオブジェクトに対しては、プライベートヘルパーメソッドを使用する必要があります。必ずしも大きな不便ではなく、なぜクラスフィールドでそれを行うことができないのだろうかと思いますが、その理由について興味があります。