多个toString方法?

时间:2013-09-12 15:48:39

标签: java override

我在从对象列表生成逗号分隔字符串时遇到问题。 此链接Convert string in list objects to comma separated

中解释了此问题

我通过使用toString方法解决了这个问题。以前我使用toString()方法作为字符串构建器进行调试。由于我使用它来生成逗号分隔值,我无法像以前那样调试它。

无论如何都要完成两者?

3 个答案:

答案 0 :(得分:7)

应该有一个单独的对象来处理格式化。这就是为什么你在java.text中看到日期和数字的格式化对象的原因,因为有太多不同的格式,你需要与数据对象分开的专用格式化程序。

查看toString的用途,description given in the javadoc

  

返回对象的字符串表示形式。一般来说,   toString方法返回一个“文本表示”的字符串   宾语。结果应该是简洁但信息丰富的表示   一个人很容易阅读。建议所有人   子类重写此方法。

Odersky / Spoon / Venners预订 Scala编程说:

  

toString的结果主要是为了帮助程序员   提供可在调试打印语句中使用的信息,日志   消息,测试失败报告以及解释器和调试器输出。

Effective Java (第10项:始终覆盖toString)似乎假设toString的目的是在调试或记录时向开发人员提供诊断信息。

我将保留用于调试的toString的实现,并创建一个单独的CSV格式化对象来处理csv生成。这样,toString的目的仍然是调试,在对象作为数据持有者的工作和CSV生成之间保持关注点的分离。

答案 1 :(得分:0)

除了将已处理的字符串(例如col5.getId()user.getAddress().getAddress1())添加到列表(这可能是最好和最简单的答案)之外,您还可以编写一个覆盖的包装器toString

public class AddressForCsv {
  private final Address address;

  public AddressForCsv(Address address) {
    this.address = address;
  }

  @Override public String toString() {
    return address.getAddress1();
  }
}

然后,将该包装器对象添加为“列”,您的数据将正确显示。

答案 2 :(得分:0)

使用一些番石榴魔法和lombok(@Data):

@Data
public class Employee {
    private String name;
    private int age;
}

final List<Employee> employees = Lists.newArrayList(new Employee("Emp 1",25), new Employee ("Emp 2",25));
final List<Employee> names = Lists.newArrayList(Lists.transform(empList, new Function<Employee, String>() {
    @Override
    private String apply(final Employee e) {
        return e.getName();
    }
}));
// names = [Emp 1, Emp 2]
final String output = Joiner.on(", ").join(names);
// output = "Emp 1, Emp 2"

请注意,Function不必是匿名类,而Employee通常生成toString()(来自lombok)。

参考:guavalombok