【问题标题】:Avoid instantiating new objects inside loops in java避免在java中的循环内实例化新对象
【发布时间】:2013-07-25 09:27:13
【问题描述】:

我想避免在循环中创建 SelectItem 的新实例。 你能帮我怎样避免它。

public List<SelectItem> createLocales() {
    final List<SelectItem> enabledLocales = new ArrayList<SelectItem>();
    final List<String> langCodes = labeldbservice.getEnabledLocales();
    LOGGER.debug("getEnabledLocales: size={0}", langCodes);
    for (final String langCode : langCodes) {
        enabledLocales.add(new SelectItem(langCode, LocaleUtils.toLocale(langCode).getDisplayName()));
    }
    return enabledLocales;
}

【问题讨论】:

  • 为什么要避免它?这似乎是为每个langCode 添加SelectItemenabledLocales 的最干净的方法。
  • 那么你将如何为不同的语言代码创建不同的对象呢?

标签: java loops pmd


【解决方案1】:
public List<SelectItem> createLocales() {
    final List<SelectItem> enabledLocales = new ArrayList<SelectItem>();
    final List<String> langCodes = labeldbservice.getEnabledLocales();
    final SelectItem sItem = new SelectItem();

    LOGGER.debug("getEnabledLocales: size={0}", langCodes);
    for (final String langCode : langCodes) {
        sItem.setValue(langCode);
        sItem.setLabel(LocaleUtils.toLocale(langCode).getDisplayName());
        enabledLocales.add(sItem);
    }
    return enabledLocales;
}

【讨论】:

    【解决方案2】:

    我通过创建一个返回新对象的方法解决了这个 PMD 问题。我将在循环中调用此方法以获取新对象。
    对于您的代码,它将是这样的。

    public List<SelectItem> createLocales() {
        final List<SelectItem> enabledLocales = new ArrayList<SelectItem>();
        final List<String> langCodes = labeldbservice.getEnabledLocales();
        LOGGER.debug("getEnabledLocales: size={0}", langCodes);
        for (final String langCode : langCodes) {
            enabledLocales.add(getNewSelectItem(langCode, LocaleUtils.toLocale(langCode).getDisplayName()));
        }
        return enabledLocales;
    }
    
    public SelectItem getNewSelectItem(String langCode, String displayName) {
        return new SelectItem(langCode, displayName);
    }
    

    【讨论】:

      【解决方案3】:

      我不明白您为什么要更改此代码,但假设您已将其测量为性能瓶颈,要么缓存 createLocales 的结果(全局或使用 ThreadLocal 懒惰地构建它的每个线程),或者也许相反返回一个列表,从 langCode 返回一个映射到延迟实例化和缓存所需 SelectItem 实例的值。

      【讨论】:

      • 最初我只使用地图,但在 UI 端的检索操作使用 ma 很慢,所以我尝试使用列表界面
      猜你喜欢
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 2019-03-22
      • 1970-01-01
      相关资源
      最近更新 更多