収集されたアイテムのグラフのどこかに参照がある場合は、コレクションの文字列を無限ループにすることができます。以下の例を参照してください。toString()の無限再帰を防ぐ最も効率的な方法は?
はい、良いコーディング慣行は、最初にこれを防ぐ必要がありますが、とにかく、私の質問です:この状況で再帰を検出する最も効率的な方法は何ですか?
1つのアプローチは、スレッドローカルでセットを使用することですが、少し重いようです。
public class AntiRecusionList<E> extends ArrayList<E> {
@Override
public String toString() {
if ( /* ???? test if "this" has been seen before */) {
return "{skipping recursion}";
} else {
return super.toString();
}
}
}
public class AntiRecusionListTest {
@Test
public void testToString() throws Exception {
AntiRecusionList<AntiRecusionList> list1 = new AntiRecusionList<>();
AntiRecusionList<AntiRecusionList> list2 = new AntiRecusionList<>();
list2.add(list1);
list1.add(list2);
list1.toString(); //BOOM !
}
}
[Lombok](http://projectlombok.org/)をご覧ください。 '@ToString(exclude = {" fields "、" you "、" dont "、" want "})'でクラスに注釈を付けることができます。 :) – elias
このようなことは絶対に実行しないでください。しかし、log4j(または類似の)デバッグをオンに切り替えると発生する可能性があるため、このようなことは本当の痛みになる可能性があります。したがって、問題をデバッグして、ロガーメッセージ自体の問題に遭遇することになります。非常に面倒です! +1私の質問 – davidfrancis
@ davidfrancis - ロギングとデバッグは、これが出てきた場所です!乾杯。 – marathon