StringBuilder中有多个StringBuilder。值得吗?

我收到一个型号清单。模型的数量可能很大。该模型具有许多特性,并且其中任何一个都可能为 null

我需要基于其属性为每个模型构建一个字符串。如果 property == null ,那么我将一些静态部分添加到结果字符串中,例如“ property1 is null”

如果 property!= null ,那么我添加类似这样的内容“ property1 =='valueOfThePropertyHere'”

结果字符串应如下所示: prop1 == 'value1' and prop2 is null and prop3 == 'value3' and prop4 == 'value4' and prop5 is null and ..... propN == 'valueN'

然后我为列表中的每个模型生成这样的字符串。

很明显,我在for循环中执行此操作,为此我使用了StringBuilder。事实是,在StringBuilder的 append 方法中,我使用三元运算符检查了模型的每个字段是否为空,并基于此将检查结果添加到结果字符串中。但是,如果属性不为null,那么我需要添加一些静态部分+字段本身的值+一些更多静态内容。这意味着我需要为我拥有的每个属性再添加一个StringBuilder。或者我可以使用“ +”将其转换为StringBuilder,据我所知,在StringBuilder中使用“ +”是个坏习惯(但我还是必须使用它)。

示例:

List<Model> models = repository.getModels();

for (Model m: models) {
    StringBuilder stringBuilder = new StringBuilder();

    stringBuilder
    .append(m.getField1() == null ? "field1  is null" : "field1 == '" + new StringBuiler().append(m.getField1()).append("'").append(" and ").toString()))
    .append(m.getField2() == null ? "field2  is null" : "field2 == '" + new StringBuiler().append(m.getField2()).append("'").append(" and ").toString()))
    ...............
    .append(m.getFieldN() == null ? "fieldN  is null" : "fieldN == '" + new StringBuiler().append(m.getFieldN()).append("'").append(" and ").toString()));

    System.out.println(stringBuilder.toString());
    }

从性能的角度来看,它看起来不太好,因为对于模型列表中的每个模型,我都会在堆中创建另一堆StringBuilder对象,只是为了获得结果字符串。

我想念什么吗?从性能角度来看,有更好的方法吗?还是可以,因为我暂时没有其他选择。

zjm550 回答:StringBuilder中有多个StringBuilder。值得吗?

简单点吧。

代替

stringBuilder
.append(m.getField1() == null ? "field1  is null" : "field1 == '" + new StringBuiler().append(m.getField1()).append("'").append(" and ").toString()))

使用:

if (m.getField1() == null) {
  stringBuilder.append("field1  is null");
} else {
  stringBuilder.append("field1 == '").append(m.getField1()).append("'").append(" and ");
}

除了在StringBuilder调用中使用StringBuilder.append的奇怪之处(以及为什么不无论如何都使用+ ...)之外,解析{{ 1}}在条件表达式中。将其分成几行要容易得多。


如果您发现自己不得不重复很多这种代码模式,请定义一个方法:

:

然后像这样调用:

void append(StringBuilder stringBuilder,String name,Object value) {
  stringBuilder.append(name);
  if (value == null) {
    stringBuilder.append(" is null");
  } else {
    stringBuilder.append(" == '").append(value).append("'").append(" and ");
  }
}
,

真是一团糟!仅仅因为您可以进行链调用,并不意味着您应该:

List<Model> models = repository.getModels();

    for (Model m: models) {
        StringBuilder stringBuilder = new StringBuilder();

        String field = m.getField1();
        if(field==null) {
            stringBuilder.append("field1 is null");
        } else {
            stringBuilder.append("field1 == ").append(m.getField1()).append("'");
        }

        if(stringBuilder.length()>0) {
            stringBuilder.append(" and ");
        }

        field = m.getField2();
        if(field==null) {
            stringBuilder.append("field2 is null");
        } else {
            stringBuilder.append("field2 == ").append(m.getField1()).append("'");
        }

        if(stringBuilder.length()>0) {
            stringBuilder.append(" and ");
        }
        ...

        System.out.println(stringBuilder.toString());
    }

要避免所有这些潜在的重复(取决于字段数):

void appendField(StringBuilder stringBuilder,String fieldName,String value) {
    if(stringBuilder.length()>0) {
        stringBuilder.append(" and ");
    }
    stringBuilder.append(fieldName);
    if(value==null) {
        stringBuilder.append(" is null");
    } else {
        stringBuilder.append(" == '").append(value).append("'");
    }
}
String toString(Model m) {
    StringBuilder stringBuilder = new StringBuilder();

    appendField(stringBuilder,"field1",m.getField1());
    appendField(stringBuilder,"field2",m.getField2());
    ...
    appendField(stringBuilder,"fieldN",m.getFieldN());

    return stringBuilder.toString();
}

List<Model> models = repository.getModels();

for (Model m: models) {
    System.out.println(toString(m));
}
本文链接:https://www.f2er.com/3137082.html

大家都在问