Почему ToStringBuilder работает непоследовательно?
В следующем коде, почему две строки, содержащие System.out.println(person);
дать разные результаты? Вторая строка косвенно вызывает метод Job.toString
уступая строку "Manager"
, но первая строка загадочно не уступает Job@28f67ac7
, Линия между person.put("a", "b");
мне не кажется, что это должно иметь какое-то значение.
Код:
import java.util.*;
import org.apache.commons.lang3.builder.*;
class Job extends HashMap<String, String> {
@Override public String toString() {
return "Manager";
}
}
class Person extends HashMap<String, String> {
Job job;
Person() {
this.job = new Job();
}
@Override public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}
class Test {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person);
person.put("a", "b");
System.out.println(person);
}
}
Приставка:
Person@2b80d80f[job=Job@28f67ac7,threshold=0,loadFactor=0.75]
Person@2b80d80f[job=Manager,threshold=12,loadFactor=0.75]
1 ответ
Решение
2 вещи способствуют изменению выхода:
- ToStringBuilder избегает вызова toString() в равных экземплярах, чтобы избежать бесконечных рекурсий.
- Ваши классы Person и Job наследуют метод equals() HashMap, вызывая
new Person().equals(new Job()) == true
Это означает, что пока person и person.job в вашем примере остаются равными друг другу, ToStringBuilder не будет вызывать person.job.toString(), но при изменении содержимого карты будет вызываться person.job.toString().