Почему 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().

Другие вопросы по тегам