0

我想避免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;
}
4

3 回答 3

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;
}
于 2013-07-25T10:00:53.060 回答
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);
}
于 2014-03-16T04:48:15.930 回答
0

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

于 2013-07-25T09:35:08.897 回答