企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
扩展函数在开发中为我们提供了非常多的便利,但是在实际应用中,我们可能会将这个特性滥用。 在上一节中,我们提到过一些常用的方法封装到Utils类中,其中就包括ImageLoaderUtsils。这里以其中加载网络图片为例: ``` fun Context.loadImage(url:String, imageView :ImageView){ GlideApp.with(this) .load(url) .placeholder(R.mipmap.img_default) .error(R.mipmap.ic_error) .into(imageView) } // ImageActivity.kt中使用 ... this.loadImage(url, imgView) ... ``` 也许你在用的时候并没有感觉出什么奇怪的地方,但是实际上,我们并没有以任何方式扩展现有类。**上述代码仅仅为了在函数调用的时候省去参数,这是一种滥用扩展机制的行为**。 我们知道,**Context作为“God Object”,已经承担了很多责任。我们基于Context扩展,还很可能产生ImageView与传入上下文周期不一致导致的很多问题**。 **正确的做法应该是在ImageView上进行扩展**: ``` fun ImageView.loadImage(url:String){ GlideApp.with(this.context) .load(url) .placeholder(R.mipmap.img_default) .error(R.mipmap.ic_error) .into(this) } ``` **这样在调用的时候,不仅省去了更多的参数,而且ImageView的生命周期也得到了保证**。 **实际项目中,我们还需要考虑网络请求框架替换及维护的问题,一般会对图片请求框架进行二次封装**: ``` object ImageLoader { fun with(context: Context, url: String, imageView: ImageView) { GlideApp.with(context) .load(url) .placeholder(R.mipmap.img_default) .error(R.mipmap.ic_error) .into(imageView) } ... } ``` 所以,**虽然扩展函数能够提供许多便利,我们还是应该注意在恰当的地方使用它,否则会造成不必要的麻烦**。