使用String.format替代字符串拼接的IntelliJ Idea toString方法模板

11
我想为toString方法创建IntelliJ Idea模板,使用String.format而不是连接、StringBuffer等方法。例如,我有以下对象:
public class Foo {
    private int id;
    private String name;
    private List<String> values;
}

如果我默认为所有字段生成toString,Idea将生成:

@Override
public String toString() {
    return "Foo{" +
            "id=" + id +
            ", name='" + name + '\'' +
            ", values=" + values +
            '}';
}

但我想要生成以下内容:

@Override
public String toString() {
    return String.format("Foo(id=%d, name=%s, values=%s)", id, name, values);
}

你应该小心处理这个问题。虽然String.format更易读,但与旧式的加号拼接相比,它的性能非常差。 - Justin Rowe
Java 8及更高版本的一种新方法是使用StringJoiner,如我在类似问题的回答中所示。 - Basil Bourque
2个回答

17

对于仍在寻找的任何人:

public java.lang.String toString() {
return String.format(
"$classname (##
#set ($i = 0)
#foreach ($member in $members)
#if ($i != 0)##
, ##
#end
$member.name=%s##
#set ($i = $i + 1)
#end
)",##
#set ($i = 0)
#foreach ($member in $members)
    #if ($i != 0)
    ,##
    #end
    #if ($member.primitiveArray || $member.objectArray)
    java.util.Arrays.toString(this.$member.name)##
    #else
    this.$member.name ##
    #end
    #set ($i = $i + 1)
#end
);
}

改编自 这个模板

编辑

对于那些想知道这是什么(实际上问题非常具体,我不知道你是怎么到这里来的,哈哈):这是一个用于生成toString方法的 IntelliJ 模板。

代码生成可以帮助您根据预设模板生成代码结构和重复元素,而无需手动编写所有内容。

请在 此处此处 了解更多关于 toString 的信息。


1
@linuslabo,我们应该如何处理这些模板? - fIwJlxSzApHEZIl
@anon58192932 你可以在你的类中生成一个toString方法,该方法使用与问题所要求的相同的String.format。请查看Intellij文档 - Linuslabo
在IntelliJ中,这个模板应该放在哪里? - Basil Bourque
@Basil请查看上面评论中的文档链接。 - Linuslabo
对于那些想知道在哪里放置此模板(就像我和@KrishnaAcharya一样),并且不想逐字逐句地阅读链接文档(是的,没有快照...),它在选择toString()字段的对话框中。您可以从“模板”下拉列表中选择,或通过单击“设置...”按钮添加自己的模板。 - lidlesseye
显示剩余2条评论

0
它将以Json格式生成toString。 {{link1:在此输入图像描述}}
public java.lang.String toString() {
#if ( $members.size() > 0 )
#set ( $i = 0 )
return "{\"$classname\":{"
#foreach( $member in $members )
#if ( $i == 0 )
+ "##
#else
+ ", ##
#end
#if ( $member.array )
\"$member.name\":" + java.util.Arrays.toString($member.accessor)
#elseif ( $member.string || $member.primitive || $member.numeric || $member.boolean || $member.enum )
\"$member.name\":\"" + $member.accessor + "\""
#else
\"$member.name\":" + $member.accessor
#end
#set ( $i = $i + 1 )
#end
+ "}}";
#else
return "{$classname}";
#end
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接