是否应该添加toString()方法?

时间:2012-07-30 07:06:08

标签: java stringbuffer

这是一段代码。

List<BDDObject> childlist = savingObject.getChildren("TherapyAreaReference");

if (childlist.size() > 1) {
  for (int i = 0; i < childlist.size() - 1; i++) {
    String newMedcondRefChild = ((String) childlist
            .get(i)
            .getValue( IDDConstants.IDD_THERAPY_AREA_REF_VALUE))
            .toLowerCase()
            .trim()
            .concat(((String) childlist
            .get(i)
            .getValue(IDDConstants.IDD_THERAPY_AREA_REF_TYPE_NAME)) 
            .toLowerCase().trim());
  }
}

IDDConstants中定义了公共静态最终字符串。由于StringBuffer更有效,如何将它整合到concat操作中?

2 个答案:

答案 0 :(得分:0)

在您问题的代码中,StringBuffer / StringBuilder不会给您带来任何性能提升,因为您只会连接两个字符串。但是,问题并未说明您在newMedconfRefChild中使用字符串做了什么。如果您的实际目标是连接每个循环迭代的字符串,然后,您应该使用StringBuilder(仅在确实需要时使用StringBuffer,更喜欢{{1} })。

答案 1 :(得分:0)

我猜测的目的是生成“报告”列表,每个BDDObject记录一个。基于这个想法,您的代码看起来应该更像这样:

public List<String> getReport(List<BDDObject> records) {
List<String> reports = new ArrayList<String>(record.size());
    for (BDDObject record:records) {
    String newMedcondRefChild = String.valueOf(record.getValue( IDDConstants.IDD_THERAPY_AREA_REF_VALUE))
            .toLowerCase()
            .trim() + String.valueOf(record.getValue(IDDConstants.IDD_THERAPY_AREA_REF_TYPE_NAME))) 
            .toLowerCase().trim());
    reports.add(newMedcondRefChild);
    }
    return reports;
}

关于toString()是否有用的问题,我认为它适合的唯一地方是BDDObject本身。它看起来像这样:

class BDDObject {
...
    @Override
    public String toString() {
        return String.valueOf(getValue(IDDConstants.IDD_THERAPY_AREA_REF_VALUE)).toLowerCase().trim() + 
            String.valueOf(getValue(IDDConstants.IDD_THERAPY_AREA_REF_TYPE_NAME)).toLowerCase().trim());
}

在这种情况下,创建报告的功能变得微不足道了:

public List<String> getReport(List<BDDObject> records) {
List<String> reports = new ArrayList<String>(record.size());
    for (BDDObject record:records) {
        reports.add(record.toString());
    }
    return reports;
}

如果你想要的是一个包含所有值的looooong字符串,你可以使用StringBuilder,如下所示:

public String getReport(List<BDDObject> records) {
StringBuilder sb = new StringBuilder();
    for (BDDObject record:records) {
        sb.append(String.valueOf(record.getValue( IDDConstants.IDD_THERAPY_AREA_REF_VALUE))
            .toLowerCase()
            .trim());
        sb.append(String.valueOf(record.getValue(IDDConstants.IDD_THERAPY_AREA_REF_TYPE_NAME)) 
            .toLowerCase().trim()));

    }
    return sb.toString();
}

这将返回彼此追加的所有记录。我怀疑它的可读性,但我希望你能得到这个想法。当您需要迭代地构建字符串时,StringBuilder很有用(如上例所示)。 StringBuilder不应该用于替换单个String操作,例如:String a = b.get() + c.get();,因为编译器在这些情况下隐式创建了StringBuilder,因此无法实现性能改进。