1

有什么方法可以“暂时”附加 StringBuilders 吗?基本上我想要的是相同的功能和行为String.concat(),但我们不允许使用 String.concat() 或 concat Strings +。我已经转向 StringBuilder,但它是可变的。

例如:

StringBuilder aliasA = new StringBuilder("a");
StringBuilder dot = new StringBuilder(".");
Clausula clause1 = new Clausula(aliasA.append(dot).append("id").toString());
Clausula clause2 = new Clausula(aliasA.append(dot).append("name").toString());

我的问题是,当我构建时clause2, aliasA 不再是"a",而是"a.id"

PS:我也不能使用 StringBuffer 。

4

6 回答 6

2

使用Apache Commons 的StringUtils怎么样?


你可以这样做:

String a = "a";
String dot = ".";

String clause1 = StringUtils.join(a, dot, "id");
String clause2 = StringUtils.join(a, dot, "name");

或者

String clause1 = StringUtils.join("a", ".", "id");
String clause2 = StringUtils.join("a", ".", "name");

甚至

String clause1 = buildPropertyNotation("id");
String clause2 = buildPropertyNotation("name");

// ...

private buildPropertyNotation(String propName) {
    return StringUtils.join("a", ".", propName);
}

我真的认为它对于任何目的都具有足够的可读性。

于 2013-07-26T11:09:35.977 回答
2

StringBuilder 的全部意义在于它是可变的。不允许使用字符串连接的原因是它会创建新对象,因为字符串是不可变的。实际上,这通常被 jvm 优化掉,从优化的角度来看完全不是问题。所以,你所要求的是两全其美。您希望基本上使用旨在使不这样做成为可能的类来创建新对象。

所以,简短的回答:不要那样做,做别的事情。在您的情况下, Formatter 类可能会起到作用,因为它为您提供了一个可重用的模板,您可以将值传递到该模板中。而且它更具可读性。

Formatter f = new Formatter("%s.%s");
String formatted = f.format("a","id");

实际上,只是写“a”+“。” + "id" 也很好。StringBuilders 非常适合有循环和条件逻辑的更复杂的情况。然而,像这样的简单表达式对于编译器的优化来说真的很容易实现。我建议您优化代码以提高可读性,并根据需要而不是过早地进行优化。

于 2013-07-26T10:51:35.790 回答
1

字符串是不可变的,所以要利用它。创建 StringBuilder 是为了构建字符串,因为字符串连接很昂贵(创建太多对象)。因此,您可以使用两者来实现您想要的行为:

String aliasA = "a";
String dot = "."
StringBuilder sb= new StringBuilder(aliasA);
Clausula clause1 = new Clausula(sb.append(dot).append("id").toString());
// This empties the SB, another option could be another new SB
sb.delete(0,sb.length()).append(aliasA);
Clausula clause2 = new Clausula(sb.append(dot).append("name").toString());
于 2013-07-26T10:36:11.777 回答
1

你试过了吗:aliasA.toString().concat(...)

(对不起,我不能评论)

另请参阅: Java 中 toString() 中的 StringBuilder 与字符串连接

于 2013-07-26T10:16:29.563 回答
1

像这样的东西不会起作用吗?

StringBuilder aliasA = new StringBuilder("a");
StringBuilder dot = new StringBuilder(".");
Clausula clause1 = new Clausula(new StringBuilder(aliasA).append(dot).append("id").toString());
Clausula clause2 = new Clausula(new StringBuilder(aliasA).append(dot).append("name").toString());
于 2013-07-26T10:20:06.573 回答
0

好的,所以我所做的,使用Jilles van Gurp在他的回答中建议的格式,定义我自己的链接方法:

private static String link(String... strings) {
        String f = "";
        String linked;
        String amp = "%s";
        String vAmp = "";
        for (String st : strings) {
            vAmp = new StringBuilder(vAmp).append(amp).toString();
        }

        linked = f.format(vAmp, strings);

        return linked;
}

我不知道它在性能方面是否最佳,但它易于使用和阅读,并且我的技术团队允许使用。

于 2013-07-26T12:21:19.157 回答