gpt4 book ai didi

java - 带有嵌套缩进的 Eclipse toString() 生成器

转载 作者:行者123 更新时间:2023-11-30 01:57:07 24 4
gpt4 key购买 nike

Eclipse 有一个方便的模板,可以自动生成类的 toString() 方法。您可以通过按 Alt+Shift+S 并单击“Generate toString()...”来访问它”

从那里您可以选择要包含在派生的 toString() 中的字段,并设置其他选项来确定应如何生成它。

我想用它来快速生成大量类的 toString() 方法。

以这个例子为例,这里有一个 Song 类:

public class Song {
private String title;
private int lengthInSeconds;
public Song(String title, int lengthInSeconds) {
this.title = title;
this.lengthInSeconds = lengthInSeconds;
}
// getters and setters...

}

这是一个 Album 类,其中包含 Song 数组:

public class Album {
private Song[] songs;
private int songCount;
public Album(Song[] songs) {
this.songs = songs;
this.songCount = songs.length;
}
//getters...

}

我目前使用此模板生成我的 toString() 方法(使用“StringBuilder/StringBuffer - 链式调用”选项):

class ${object.className} {
${member.name}: ${member.value},
${otherMembers}
}

我现在可以使用它来生成 SongtoString():

@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("class Song {\n ");
if (title != null)
builder.append("title: ").append(title).append(",\n ");
builder.append("lengthInSeconds: ").append(lengthInSeconds).append("\n}");
return builder.toString();
}

对于相册:

@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("class Album {\n ");
if (songs != null)
builder.append("songs: ").append(Arrays.toString(songs)).append(",\n ");
builder.append("songCount: ").append(songCount).append("\n}");
return builder.toString();
}

现在,假设我创建了一个相册并想要测试其 toString(),如下所示:

@Test
public void testToString() {
Song[] songs = new Song[] {
new Song("We Will Rock You", 200),
new Song("Beat it", 150),
new Song("Piano Man", 400) };
Album album = new Album(songs);
System.out.println(album);
}

这就是我得到的:

class Album {
songs: [class Song {
title: We Will Rock You,
lengthInSeconds: 200
}, class Song {
title: Beat it,
lengthInSeconds: 150
}, class Song {
title: Piano Man,
lengthInSeconds: 400
}],
songCount: 3
}

但我想要的是一个可以嵌套缩进的生成器,如下所示:

class Album {
songs: [class Song {
title: We Will Rock You,
lengthInSeconds: 200
}, class Song {
title: Beat it,
lengthInSeconds: 150
}, class Song {
title: Piano Man,
lengthInSeconds: 400
}],
songCount: 3
}

如果每个对象中有更多类,则继续这样做(如果有意义的话)。

我尝试创建一种方法,在调用其 toString() 之前,可以用 4 个空格和一个换行符替换换行符:

private String indentString(java.lang.Object o) {
if (o == null) {
return "null";
}
return o.toString().replace("\n", "\n ");
}

这个想法是它可以将附加中的 "\n " 变成 "\n " 等等,但我不确定是否有可能调用 Eclipse 模板内的函数。

有人知道如何做到这一点吗?我已经检查了文档,但它非常稀疏。也看了一遍,但我没有看到任何类似的问题。

作为引用,我专门使用 Spring Tool Suite 版本 4.0.1RELEASE。

最佳答案

这不是我希望的方式,但我确实有一个解决方案。我能够通过创建 custom toString() builder class 来完成我想要的事情

这是我创建的类:

/*
* Helper class to generate formatted toString() methods for pojos
*/
public class CustomToStringBuilder {
private StringBuilder builder;
private Object o;

public CustomToStringBuilder(Object o) {
builder = new StringBuilder();
this.o = o;
}

public CustomToStringBuilder appendItem(String s, Object o) {
builder.append(" ").append(s).append(": ").append(toIndentedString(o)).append("\n");
return this;
}

public String getString() {
return "class " + o.getClass().getSimpleName() + "{ \n" + builder.toString() + "}";
}

/**
* Convert the given object to string with each line indented by 4 spaces
* (except the first line).
*/
private static String toIndentedString(java.lang.Object o) {
if (o == null) {
return "null";
}
return o.toString().replace("\n", "\n ");
}
}

然后我可以使用 Alt + Shift + S -> “Generate toString()...” 和 “select自定义 toString() 构建器”并选择我的 CustomToStringBuilder。这样,Eclipse 就会为 SongAlbum 生成以下代码:

//Song
@Override
public String toString() {
CustomToStringBuilder builder = new CustomToStringBuilder(this);
builder.appendItem("title", title).appendItem("lengthInSeconds", lengthInSeconds);
return builder.getString();
}

//Album
@Override
public String toString() {
CustomToStringBuilder builder = new CustomToStringBuilder(this);
builder.appendItem("songs", songs).appendItem("songCount", songCount);
return builder.getString();
}

将它们放在一起并再次运行测试给出了我想要的结果:

class Album{ 
songs: [class Song{
title: We Will Rock You
lengthInSeconds: 200
}, class Song{
title: Beat it
lengthInSeconds: 150
}, class Song{
title: Piano Man
lengthInSeconds: 400
}]
songCount: 3
}

但是,如果可能的话,我仍然更喜欢一种不需要在源代码中添加新类的方法,因此我会将问题悬而未决一两天,看看是否有人可以找到不同的方法来做到这一点更容易。

关于java - 带有嵌套缩进的 Eclipse toString() 生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54027685/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com