【问题标题】:Should the toString() method be added?是否应该添加 toString() 方法?
【发布时间】:2012-07-30 07:06:07
【问题描述】:

这是一段代码。

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 操作中?

【问题讨论】:

  • 你能重新表述你的问题吗?
  • 您是否尝试过阅读文档? docs.oracle.com/javase/1.5.0/docs/api/java/lang/…
  • 首先,您应该使用 for-each-loop 和一些额外的局部变量来使您的代码更具可读性/可理解性。
  • 你在用newMedcondRefChild做什么?它在每个循环周期中都被重写。您是否想要一个包含所有记录的长字符串(可能)一个 List,其中包含遇到的每个记录的字符串?
  • 答案对您有帮助吗?

标签: java stringbuffer


【解决方案1】:

我猜测其目的是生成一个“报告”列表,每找到一个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,因此不会实现实际的性能改进。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 如果您不想在编辑字符串时同步,那么使用 StringBuilder - 它更快。
    猜你喜欢
    • 1970-01-01
    • 2010-09-11
    • 2023-03-06
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    相关资源
    最近更新 更多