有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么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) 个答案

  1. # 1 楼答案

    有两件事导致了产出的变化:

    • toString Builder避免在相等的实例上调用toString(),以避免无限递归
    • Person和Job类继承HashMap的equals()方法,导致new Person().equals(new Job()) == true

    这意味着当一个人和另一个人。在你们的例子中,工作是平等的,ToStringBuilder不会给这个人打电话。工作toString(),但当地图内容更改时,person。工作将调用toString()