Kotlin中intent.putExtra传参代码冗余过长如何优化
Kotlin Intent传参冗余代码优化方案
你当前写的when分支属于完全重复的冗余逻辑,既不需要逐一枚举编号值,也不需要写几十条判断分支,优化方案如下:
第一步:先删除无意义的重复判断
你当前的逻辑本质是:拿到Drinks参数就原样传给CoffeeShops,拿到FastFood参数就原样传给FastFood,逐行判断值是否等于1~20完全没有必要,不仅代码冗长,后续新增编号还要手动加分支。
另外注意:直接调用getStringExtra().toString()有风险,如果Intent中没有对应参数,getStringExtra()会返回null,直接toString()会得到字符串"null",引发后续逻辑异常,建议用?:给出空字符串默认值。
最简优化代码如下:
val intent = Intent(this, HNSPSFOC1::class.java) val drinks = intent.getStringExtra("Drinks") ?: "" val food = intent.getStringExtra("FastFood") ?: "" // 非空即传,不需要逐个判断编号 if (drinks.isNotBlank()) { intent.putExtra("CoffeeShops", drinks) } if (food.isNotBlank()) { intent.putExtra("FastFood", food) }
如果你需要做合法值校验,比如只允许1~20范围内的编号,也不需要写分支判断,直接转数字校验范围即可:
// 校验饮品编号合法再传参 drinks.toIntOrNull()?.takeIf { it in 1..20 }?.let { validId -> intent.putExtra("CoffeeShops", validId.toString()) } // 校验快餐编号合法再传参 food.toIntOrNull()?.takeIf { it in 1..20 }?.let { validId -> intent.putExtra("FastFood", validId.toString()) }
第二步:封装传参常量,统一管理
你提到的新建独立类存放传参key、编号值是非常规范的做法,可以避免到处硬编码字符串导致的拼写错误,后续维护也更方便。
新建一个IntentArgs.kt文件,用object单例类存放所有常量:
object IntentArgs { // 所有Intent传参的Key,全局统一调用,禁止手写字符串 const val KEY_DRINKS = "Drinks" const val KEY_COFFEE_SHOPS = "CoffeeShops" const val KEY_FAST_FOOD = "FastFood" // 统一管理分类ID合法范围,后续改范围直接改这里 const val MIN_CATEGORY_ID = 1 const val MAX_CATEGORY_ID = 20 }
之后所有传参位置都调用常量,不要硬编码字符串:
val intent = Intent(this, HNSPSFOC1::class.java) val drinks = intent.getStringExtra(IntentArgs.KEY_DRINKS) ?: "" val food = intent.getStringExtra(IntentArgs.KEY_FAST_FOOD) ?: "" drinks.toIntOrNull() ?.takeIf { it in IntentArgs.MIN_CATEGORY_ID..IntentArgs.MAX_CATEGORY_ID } ?.let { intent.putExtra(IntentArgs.KEY_COFFEE_SHOPS, it.toString()) } food.toIntOrNull() ?.takeIf { it in IntentArgs.MIN_CATEGORY_ID..IntentArgs.MAX_CATEGORY_ID } ?.let { intent.putExtra(IntentArgs.KEY_FAST_FOOD, it.toString()) }
第三步:后续扩展方案
如果你后续要新增更多列表分类,完全不需要再写when分支,可以用映射表统一处理所有分类传参:
// 配置源参数Key和目标参数Key的映射关系,新增分类只需要在这里加一行 val categoryKeyMap = mapOf( IntentArgs.KEY_DRINKS to IntentArgs.KEY_COFFEE_SHOPS, IntentArgs.KEY_FAST_FOOD to IntentArgs.KEY_FAST_FOOD ) // 统一遍历处理所有分类传参,不需要为每个分类单独写逻辑 categoryKeyMap.forEach { (sourceKey, targetKey) -> intent.getStringExtra(sourceKey) ?.toIntOrNull() ?.takeIf { it in IntentArgs.MIN_CATEGORY_ID..IntentArgs.MAX_CATEGORY_ID } ?.let { validId -> intent.putExtra(targetKey, validId.toString()) } }
后续新增列表项时,你只需要做两件事:
- 在
IntentArgs中新增对应的传参Key常量 - 在
categoryKeyMap中新增一行源Key和目标Key的映射
如果要扩大编号支持范围,直接修改MAX_CATEGORY_ID的值即可,不需要改任何业务逻辑。
内容的提问来源于stack exchange,提问作者Qwip Business
相关产品推荐
相关产品推荐

