Java StringBuilder每次都将内容附加到新行

Java StringBuilder每次都将内容附加到新行,java,stringbuilder,Java,Stringbuilder,我正在构建一个验证例程,该例程验证内容,然后以消息的形式发出警告(针对失败)。在下面的代码中,我检查值paramX和paramY的下限 StringBuilder sb= new StringBuilder(); if(paramX<10){ sb.append("paramX cannot be less than 10 "); } if(paramY<20){ sb.append

我正在构建一个验证例程,该例程验证内容,然后以消息的形式发出警告(针对失败)。在下面的代码中,我检查值paramX和paramY的下限

 StringBuilder sb= new StringBuilder();

        if(paramX<10){
            sb.append("paramX cannot be less than 10 ");
        }

        if(paramY<20){
            sb.append("paramY cannot be less than 20 ");
        }

        System.out.println(sb);
我使用了以下变通方法,但最终一次又一次地重复相同的代码(我不想重复)


有更简单的方法吗?

只需直接附加

        if(paramX<10){
            sb.append("paramX cannot be less than 10 \n ");
        }

        if(paramY<20){
            sb.append("paramY cannot be less than 20 \n ");
        }

if(paramX如果您不想反复执行,请编写一个helper方法:

public void appendString(StringBuilder builder, String value) {
    builder.append(value + System.lineSeparator());
}
然后打电话:

if(paramX<10){
    appendString(sb, "paramX cannot be less than 10 ");
}

if(paramX首先,您需要在每个
的末尾包含换行符(
\n
)。append()
您自己:

sb.append("paramX cannot be less than 10 \n");
对于重复新行逻辑,只需将其包装在一个方法中:

public void append(StringBuilder sb, Object value) {
    sb.append(value).append(System.getProperty("line.separator")).append('\n');
}
然后像这样使用它:

if(paramX < 10){
    append(sb, "paramX cannot be less than 10");
}
if(参数<10){
追加(sb,“参数不能小于10”);
}

最简单的方法是保留一个错误列表,而不是在执行时将它们串联起来。这将有助于在逻辑错误和它们的表示之间保持关注点的分离


查看Spring验证的工作原理:您有一个保留错误列表的Errors对象,以及一个单独的message source对象,用于为不同的错误填充用户可见的消息。

只需使用
\n
-它可以在任何地方工作。此外,如果有两条消息,您似乎希望有条件地添加换行符:

StringBuilder sb = new StringBuilder();

if (paramX<10) {
    sb.append("paramX cannot be less than 10 ");
}

if (paramY<20) {
    if (!sb.length() > 0) // only add newline if needed
        sb.append('\n');
    sb.append("paramY cannot be less than 20 ");
}
StringBuilder sb=新建StringBuilder();

if(paramX您可以尝试使用PrintStream,因为它有一个println(String-String)方法,可以自动添加新行

像这样的

ByteArrayOutputStream bos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(bos);
ps.println("Line 1");
ps.println("Line 2");
ps.flush();
String message = new String(bos.toByteArray());
System.out.println(message);

另一种选择是使用ApacheCommonsStrBuilder,它具有您正在寻找的功能


刚刚想到分享jdk 8的新功能,我用它来达到同样的效果。 使用StringJoiner,我们可以构造由分隔符分隔的字符序列

StringJoiner formattedString= new StringJoiner("\n"); 
formattedString.add("XXX");
formattedString.add("YYY");
System.out.println(formattedString);  

您能否将\n放在原始附加的末尾?
sb.append(“xxxx\n”);
-为什么不这样做?您是否尝试过将\n添加到第一个append.sb.append(“paramX不能小于10\n”)中;@vlcekmi3,Matt Penna:如上所述,我希望避免手动填充/格式化。然后您可以扩展
SB
并添加相应的方法,例如
appendLine()
请阅读上面的文章。我希望避免手动填充。如果我能找到一些不手动填充行格式的解决方法,我将不胜感激。可能是创建您自己的函数。但无法扩展StringBuilder StringBuffer类。因为它是最终类。所以您可以创建自定义函数。但我再次认为您必须使用“\n”手动。是的,您必须手动执行此操作,或者使用流设置更复杂的内容。java:DMy问题的乐趣在于,我使用的是遗留代码。我不想仅仅为了消息格式而接触整个设置。希望您理解我的痛苦。@Dark Knight:是的,完全理解。
System.lineSeparator()
这个
builder.append(line);builder.append(lineSeparator);
builder.append(line+lineSeparator);
更有效,因为前者为每一行创建了一个新的字符串对象。它现在已经被弃用了。建议改用。嗯,你确定吗?看起来没有弃用。不管怎样,相同的功能。
ByteArrayOutputStream bos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(bos);
ps.println("Line 1");
ps.println("Line 2");
ps.flush();
String message = new String(bos.toByteArray());
System.out.println(message);
StringJoiner formattedString= new StringJoiner("\n"); 
formattedString.add("XXX");
formattedString.add("YYY");
System.out.println(formattedString);