Android 3.5 Kotlin 1.3:如何强制方法参数仅为VISIBLE/INVISIBLE/GONE?
嗨,这个问题其实是典型的需要类型安全约束的场景,咱们有几种靠谱的解决方式,根据你的需求选就行:
1. 使用枚举类(Enum Class)
这是最直观的类型安全方案,编译阶段就能拦截非法参数,完全杜绝传错值的可能。
首先定义一个对应View可见性的枚举:
enum class Visibility { VISIBLE, INVISIBLE, GONE; // 把枚举转成对应的View常量值 fun toViewVisibility(): Int { return when (this) { VISIBLE -> View.VISIBLE INVISIBLE -> View.INVISIBLE GONE -> View.GONE } } }
然后修改你的方法,把参数类型换成这个枚举:
fun setPromotionVisibility(toVisibility: Visibility) { tvPromotion.visibility = toVisibility.toViewVisibility() }
调用的时候就只能传枚举值了:
// 正确调用 setPromotionVisibility(Visibility.VISIBLE) // 如果传234这种值,编译直接报错
优点:完全类型安全,可读性高,IDE会自动提示可选值;缺点:枚举会占用一点点额外内存,但现在Android对枚举的优化已经很好了,绝大多数场景下可以忽略。
2. 使用Android的@IntDef注解(保留Int类型)
如果不想改变参数的Int类型(比如要兼容旧代码,或者觉得枚举“太重”),可以用Android提供的注解来约束允许的Int值,编译阶段会检查。
首先需要定义一个@IntDef注解:
import androidx.annotation.IntDef // 定义允许的常量集合 @IntDef(View.VISIBLE, View.INVISIBLE, View.GONE) @Retention(AnnotationRetention.SOURCE) // 只在编译阶段生效 annotation class ViewVisibility
然后修改你的方法参数,加上这个注解:
fun setPromotionVisibility(@ViewVisibility toVisibility: Int) { tvPromotion.visibility = toVisibility }
调用的时候,IDE会提示可选的View常量,而且如果传234这种非法值,编译会报错(Android Studio默认开启Lint检查,能自动识别):
// 正确调用 setPromotionVisibility(View.VISIBLE) // 传234的话,Lint会直接提示错误
优点:保持Int参数类型,兼容旧代码;缺点:本质还是Int类型,虽然有编译检查,但通过反射或者绕过Lint的方式仍能传入非法值,类型安全性不如枚举。
3. 使用密封类(Sealed Class)
如果以后可能需要扩展可见性的逻辑(比如添加自定义的可见性处理规则),密封类是比枚举更灵活的选择:
首先定义密封类:
sealed class Visibility { object Visible : Visibility() object Invisible : Visibility() object Gone : Visibility() fun toViewVisibility(): Int { return when (this) { is Visible -> View.VISIBLE is Invisible -> View.INVISIBLE is Gone -> View.GONE } } }
然后修改方法:
fun setPromotionVisibility(toVisibility: Visibility) { tvPromotion.visibility = toVisibility.toViewVisibility() }
调用方式和枚举类似:
setPromotionVisibility(Visibility.Visible)
优点:比枚举更灵活,可以给不同的子类添加自定义逻辑;缺点:写法比枚举稍微繁琐一点,适合有明确扩展需求的场景。
总结
- 优先推荐枚举类,最直观、类型安全,适合绝大多数普通场景;
- 如果要保留Int参数类型,选**@IntDef注解**;
- 有扩展需求的话,用密封类。
内容的提问来源于stack exchange,提问作者ant2009
相关产品推荐
相关产品推荐

