避免在java中循环实例化新对象

时间:2013-07-25 09:27:13

标签: java loops pmd

我想避免在循环中创建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;
}

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

我通过创建一个返回新对象的方法解决了这个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);
}

答案 2 :(得分:0)

我不明白你为什么要更改这段代码,但假设你已经把它测量为性能瓶颈,要么缓存createLocales的结果(全局或每个Thread使用一个懒洋洋地构建它的ThreadLocal),或者可能代替返回列表,将langCode中的映射返回到懒惰实例化的值并缓存所需的SelectItem实例。