如何更高效地将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
相关产品推荐
相关产品推荐

