次のようなことをすると気づきました:
ArrayList anArray = new ArrayList();
anArray.add(anArray);
Netbeans 自動コンパイラには問題がないようで、すべてを参照できるようです。これを行うことの悪い副作用はありますか?
次のようなことをすると気づきました:
ArrayList anArray = new ArrayList();
anArray.add(anArray);
Netbeans 自動コンパイラには問題がないようで、すべてを参照できるようです。これを行うことの悪い副作用はありますか?
ほとんどの場合、何か悪いことが起こるとは思えません。
リストを再帰的に処理している場合に問題が発生し、その場合、スタック オーバーフローが発生します。
印刷すると、かなり興味深い効果が得られます。
package com.sandbox;
import java.util.ArrayList;
public class Sandbox {
public static void main(String[] args) {
ArrayList anArray = new ArrayList();
anArray.add(anArray);
for (Object o : anArray) {
System.out.println(o);
}
}
}
これは出力されました:
[(このコレクション)]
それ以外は、このようなプログラムを壊す方法を見つけていません。何も問題はないと思います。
@wobblycogs が述べたように、リストで再帰を使用するときは注意が必要ですが、考えてみると、それは実際には特別なケースではありません。これは、このコードがスタックオーバーフローを与える方法と同様に、単なる循環依存です。
package com.sandbox;
public class Sandbox {
public static void main(String[] args) {
A a = new A();
B b = new B();
a.b = b;
b.a = a;
traverse(a);
}
private static void traverse(A a) {
traverse(a.b);
}
private static void traverse(B b) {
traverse(b.a);
}
private static class A {
private B b;
}
private static class B {
private A a;
}
}
いいえ、これには本質的に問題はありません。
(ただし、指摘したように、そのオブジェクトに対して再帰的な操作を行うと、無限ループに陥る可能性があります。)