不要总是相信 @JvmOverloads,帮助程序员提高核心竞争力的30条建议

听来不错,因此我们经常将这些构造函数:

class CustomLinearLayout : LinearLayout {

constructor(context: Context?) : super(context)

constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)

constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)

}

合并成一个构造函数:

class CustomLinearLayout @JvmOverloads constructor(

context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0

) : LinearLayout(context, attrs, defStyleAttr)

第0步:出现的问题


我们先来看看Design库中的TextInputEditText控件,

在我们自定义类中,如下:

class CustomTextInputEditText : TextInputEditText {

constructor(context: Context) : super(context)

constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)

constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)

}

上面的代码可以通过一个构造函数来替换:

class CustomTextInputEditText @JvmOverloads constructor(

context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0

) : TextInputEditTe

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

xt(context, attrs, defStyleAttr)

这也是Android Studio 会自动为我们生成的代码

!](https://upload-images.jianshu.io/upload_images/15679108-d208f39b8eb1877c?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

接下来我们写一个Activity,它有两个CustomTextInputEditText 控件,第一个包含所有三个构造函数,第二个包含 @JvmOverloads注释。

class CustomTextInputEditText1 : TextInputEditText {

constructor(context: Context) : super(context)

constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)

constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)

}

class CustomTextInputEditText2 @JvmOverloads constructor(

context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0

) : TextInputEditText(context, attrs, defStyleAttr)

它们的表现最终会相同吗?

[外链图片转存失败(img-jtjcLWwA-1569229719416)(https://upload-images.jianshu.io/upload_images/15679108-f64a5b1fa110e916?imageMogr2/auto-orient/strip)]

正如你所看到的,第二个使用@JvmOverloads注解的控件没有工作。

发生了什么?为什么会有一些样式问题?

[外链图片转存失败(img-NBnEi2L8-1569229719418)(https://upload-images.jianshu.io/upload_images/15679108-0b77b50c7a77c58b?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

第1步: 理解@JvmOverloads注解


让我们再花1秒钟回看一下JvmOverloads 的定义,我们知道Kotlin编译器会产生两个重载(在我们的例子中N = 3M = 2)。所以我们最终会得到三个类似的构造函数:

@JvmOverloads

public CustomTextInputEditText(@NotNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

}

@JvmOverloads

public CustomTextInputEditText(@NotNull Context context, @Nullable AttributeSet attrs) {

this(context, attrs, 0);

}

@JvmOverloads

public CustomTextInputEditText(@NotNull Context context) {

this(context, null, 0);

}

因此在我们的自定义类中,我们总是会调用到CustomTextInputEditText三参数构造函数。

第2步:理解View的构造函数


现在让我们暂时关注到View的构造函数。

当View从XML文件中加载时,会调用其第二个构造函数。然后,此构造函数调用三参数构造函数。

public View(Context context, @Nullable AttributeSet attrs) {

this(context, attrs, 0);

}

如果通常将0作为第三个参数,为什么这个三参数构造函数要存在呢?答案在文档中。

View的这个构造函数允许子类在加载时使用它们自己的基本样式。

继承自View的类可以传递它们自己的样式来修改所有基本view属性。

简单,现在我们来看看为什么会出错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值