为什么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]

2事物有助于输出更改:

  • tostringbuilder避免在平等实例上调用tostring((以避免无限递归。
  • 您的个人和工作类继承HashMap的Equals((方法,导致new Person().equals(new Job()) == true

这意味着虽然您的示例中的job彼此相等,但tostringbuilder不会致电person.job.tostring((,但是当地图内容更改时,person.job.tostring((将被调用。

相关内容

  • 没有找到相关文章

最新更新