You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何更高效地将LengthConversion类常量添加到ArrayList以创建ListView?

更高效地将LengthConversion类的常量存入ArrayList的方法

针对你的场景,有几种比逐个调用.add()更简洁高效的实现方式,可根据维护需求选择:

1. 直接用集合初始化器构建

如果常量数量固定、后续很少变动,直接通过Arrays.asList配合ArrayList构造器一次性初始化,代码更整洁,底层执行效率和逐个add相当,但可读性更强:

List<String> conversions = new ArrayList<>(Arrays.asList(
    LengthConversion.M_TO_CM,
    LengthConversion.M_TO_MM,
    LengthConversion.M_TO_DM,
    LengthConversion.KM_TO_M,
    LengthConversion.INCH_TO_M,
    LengthConversion.FOOT_TO_M,
    LengthConversion.ASM_TO_M,
    LengthConversion.FM_TO_M,
    LengthConversion.MILE_TO_KM
));

2. 利用反射自动获取静态常量

如果后续会频繁新增转换常量,不想每次手动修改集合初始化代码,可以用反射遍历类的静态final字符串字段,自动收集值:

List<String> conversions = new ArrayList<>();
Field[] fields = LengthConversion.class.getDeclaredFields();
for (Field field : fields) {
    // 筛选静态、final、String类型的字段
    if (Modifier.isStatic(field.getModifiers()) 
        && Modifier.isFinal(field.getModifiers()) 
        && field.getType().equals(String.class)) {
        try {
            conversions.add((String) field.get(null));
        } catch (IllegalAccessException e) {
            throw new RuntimeException("读取字段失败:" + field.getName(), e);
        }
    }
}

注意:如果类中存在其他非转换相关的静态final字符串常量,需要额外过滤(比如按字段名前缀、或自定义注解标记目标字段)。反射有轻微性能开销,但仅初始化一次的话可忽略。

3. 用枚举替代静态常量(推荐长期维护)

如果这些转换类型是一组业务相关的枚举值,用枚举重构是最规范的方案——类型安全,自带遍历方法,后续新增转换类型只需修改枚举,集合初始化代码无需改动:
首先重构LengthConversion为枚举:

public enum LengthConversion {
    M_TO_CM("meter to centimeter"),
    M_TO_MM("meter to millimeter"),
    M_TO_DM("meter to decimeter"),
    KM_TO_M("kilometer to meter"),
    INCH_TO_M("inch to meter"),
    FOOT_TO_M("foot to meter"),
    ASM_TO_M("angstrom to meter"),
    FM_TO_M("fermi to meter"),
    MILE_TO_KM("mile to kilometer");

    private final String desc;

    LengthConversion(String desc) {
        this.desc = desc;
    }

    public String getDesc() {
        return desc;
    }
}

然后获取转换描述列表:

List<String> conversions = Arrays.stream(LengthConversion.values())
                                 .map(LengthConversion::getDesc)
                                 .collect(Collectors.toList());

枚举的values()方法是编译期生成的,性能优于反射,还能避免反射的异常处理问题,长期维护性最好。


内容的提问来源于stack exchange,提问作者trylearning2022

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 05:06:25