如何使用Java/Groovy使类可打印

如何使用Java/Groovy使类可打印,java,groovy,Java,Groovy,我可以通过重写类的toString()方法使类可打印(即print(x)works),还是有其他方法toString()需要创建一个字符串,我想这将涉及大量浪费的串联,特别是对于嵌套结构 如果有可用的print(PrintStream os)方法,似乎更明智,但我找不到。如果使用groovy,您可以向对象的元类添加print方法,以及类似的方法 Object.metaClass.print = { printStream -> printStream.print(delegate)

我可以通过重写类的
toString()
方法使类可打印(即
print(x)
works),还是有其他方法
toString()
需要创建一个字符串,我想这将涉及大量浪费的串联,特别是对于嵌套结构


如果有可用的
print(PrintStream os)
方法,似乎更明智,但我找不到。

如果使用groovy,您可以向
对象的元类添加
print
方法,以及类似的方法

Object.metaClass.print = { printStream ->
    printStream.print(delegate)
}

虽然听起来你可能在担心一个不必要的问题。您可以使用
StringBuilder
(或groovy的字符串插值)来减少连接。您还可以使用groovy的AST添加一个
toString
方法,并打开缓存,使其只发生一次。

+1@Jeff。您还可以将@Canonical与@ToString注释一起使用

import groovy.transform.*

@ToString(includeNames=true, cache=true)
@Canonical class Test{
    String a
    int b
    Book book
}

@ToString(includeNames=true, cache=true)
@Canonical class Book{
    String name
}

Test test = new Test('A', 1, new Book("Groovy In Action"))

//Prints
//Test(a:A, b:1, book:Book(name:Groovy In Action))  

print test
println ""
System.out.print test

对于非嵌套结构,
dump()
是一种快速解决方案:

class Person { 
    String name
    String surname 
}

p = new Person(name: "John", surname: "Doe")
println p.dump()
// prints <Person@802ef9 name=John surname=Doe>
class-Person{
字符串名
串姓
}
p=新人(姓名:“约翰”,姓氏:“Doe”)
println p.dump()
//印刷品

那么您想打印表示对象的字符串而不创建字符串吗?您可以始终使用
StringBuilder
,但这听起来像是过早的优化。基本上,我希望
打印(对象x)
。为了反映这一点,我改变了问题。有什么答案有用吗?