在 Android 中工作时,有很多次我们会创建一个 Util 文件或扩展函数来一次又一次地重用同一组代码。
在这篇博客中,我们将讨论在使用 kotlin 的 android 项目中何时使用扩展功能以及何时使用静态实用程序类。
我们将其分成:
- 什么是Extension Functions和 Util Class?
- 我们使用它们的用例?
- 使用像 Extension 或 Util Class 这样的 Wrapper 的优点。
那么,让我们开始吧。
什么是Extension Functions和 Util Class?
Extension Functions:这些就像附加到 kotlin 中的任何类的扩展属性。它为该类提供了额外的方法,而无需手动继承该类。
例如,
比方说,我们有视图,我们需要在其中使用视图的可见性。因此,我们可以为视图创建扩展功能,例如,
fun View.show() {
this.visibility = View.VISIBLE
}
fun View.hide() {
this.visibility = View.GONE
}
为了使用它,我们使用,比如,
toolbar.hide()
在这里,您可以看到我们在 android 的视图中附加了 hide() 和 show() 的附加功能。
在这里,以上两个扩展函数只能被 View Type 使用,不能被其他任何类型使用。例如,String 不能使用这里的函数。
为了访问,我们使用这个函数中的那个视图。
Utility Class:
Utility Class就像一个静态函数的集合,其代码可以通过将类型的引用作为参数传递来一次又一次地重用。
例如,如果我们以上面的可见性 Gone 和 Visible 为例,那么按照 Util 类的方式更新代码,
object Util {
fun show(view: View){
view.visibility = View.VISIBLE
}
fun hide(view: View){
view.visibility = View.GONE
}
}
为了使用它,我们使用,
Util.show(imageView)
在这里,您可以看到与扩展函数不同的是,我们需要将视图的引用作为参数传递。
或者我们可以不使用 Util 对象直接编写 util 函数。例如,我们将创建一个文件Util.kt并将文件更新为,
fun show(view: View){
view.visibility = View.VISIBLE
}
fun hide(view: View){
view.visibility = View.GONE
}
要使用它,我们可以直接调用,
show(imageView)
我们可以通过上述两种方式创建 Util。
我们使用它们的用例?
现在,在本节中,让我们讨论何时何地使用它们。
考虑一下,当在 kotlin 中创建扩展函数时,它会为该特定类型(比如说 ImageView)创建一个属性,所有 ImageView 都可以访问该属性。
但是,在使用 Util 时,我们不会再次添加此属性,并且再次使用 util 函数,我们需要显式调用它。
所以,现在让我们通过一个例子来理解这一点。
考虑我们有一个 ImageView,我们想从 url 加载图像。为此,我们可能会考虑使用 Glide 或 Picasso。所以,在这里我将使用 Glide 并创建一个扩展函数,比如
fun ImageView.loadImage(url: String) {
Glide.with(this.context).load(url).into(this)
}
在这里,您可以看到我创建了一个名为 loadImage() 的扩展函数,它以 url 作为参数,我们将 url 加载到 ImageView 中。
现在,要使用它,我们只需使用,
imageViewProfile.loadImage("url")
此 loadImage 属性由 imageViewProfile 访问,此处扩展功能帮助 ImageView 从 url 加载图像。
现在,请考虑一下,因为这不仅适用imageViewProfile于应用程序中的所有 ImageView,而且只能由 ImageView 访问。loadImage()现在已经成为 ImageViews 的属性。所有的 ImageViews 都可以访问它,但只需使用点运算符。
现在,考虑使用 Util 类的相同示例。在这里,您需要同时传递 imageView 和 url 来加载图像。
fun loadImage(imgView:ImageView,url:String){
Glide.with(this.context).load(url).into(imgView)
}
要使用它,我们必须调用Util.loadImage().
现在,这里它与 imageView 无关。我们将 ImageView 作为参数与 url 一起传递给此函数,以在图像视图中加载 url。
何时使用 Extension 函数或 Util 函数?
假设我们在应用程序中多次出现相同的操作,例如从应用程序的多个 ImageView 中的 ImageView 中的 url 加载图像,我们应该更喜欢使用扩展功能,因为它就像这里的主要用例一样,所以它被附加到 imageView 作为属性。
但是,当我们不想大量使用该属性并且它在应用程序中非常罕见地出现一次或两次时,我们应该使用 util 函数。
使用像 Extension 或 Util Class 这样的 Wrapper 的优点。
无论如何,使用扩展函数或 util 类对我们开发 Android 应用程序有很大帮助。它帮助我们,
- 使代码可重用。
- 使代码更具可读性。
- 很容易迁移到另一个库。
让我一 一解释。
让我们在上面的例子中说,
fun ImageView.loadImage(url: String) {
Glide.with(this.context).load(url).into(this)
}
这里使用glide加载图片是一次写的,可以多次使用。
使用 loadImage() 作为名称使我们的代码像我们使用它时一样可读,
imageViewProfile.loadImage("url")
名称本身更清楚地表明我们正在尝试将 url 加载到 ImageView。
最后,使用包装器的最大优势可以帮助我们在需要时迁移到另一个库。例如,假设有一天我们需要移除 Glide 库并将代码替换为 Picasso 以加载图像。
然后我们只需要在扩展函数或 util 类中只更新一次代码,就可以成功替换库。我们不必更改或调整视图文件中的任何代码。
结论
根据用例,我们应该决定使用哪种方式使我们的代码可重用。
如果大伙有什么好的学习方法或建议欢迎大家在评论中积极留言哈,希望大家能够共同学习、共同努力、共同进步。
小编在这里祝小伙伴们在未来的日子里都可以 升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰!!
不论遇到什么困难,都不应该成为我们放弃的理由!
很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,需要一份小编整理出来的学习资料的关注我主页或者点击文末微信卡片即可免费领取~
这里是关于我自己的Android 学习,面试文档,视频收集大整理,有兴趣的伙伴们可以看看~
如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言,一定会认真查询,修正不足,谢谢。