当前位置:   article > 正文

Android - 使用DSL构建专有的语法结构_android dsl

android dsl

一、简介

DSL的全称是领域特定语言(Domain Specific Language),它是编程语言赋予开发者的一 种特殊能力,通过它我们可以编写出一些看似脱离其原始语法结构的代码,从而构建出一种专 有的语法结构。

  1. dependencies {
  2. implementation 'com.squareup.retrofit2:retrofit:2.6.1'
  3. implementation 'com.squareup.retrofit2:converter-gson:2.6.1'
  4. }

Gradle是一种基于Groovy语言的构建工具,因此上述的语法结构其实就是Groovy提供的DSL 功能。有没有觉得很神奇?不用吃惊,借助Kotlin的DSL,我们也可以实现类似的语法结构,下 面就来具体看一下吧。

第一步、

首先新建一个DSL.kt文件,然后在里面定义一个Dependency类,代码如下所示:

  1. class Dependency {
  2. val libraries = ArrayList<String>()
  3. fun implementation(lib: String) {
  4. libraries.add(lib)
  5. }
  6. }

这里我们使用了一个List集合来保存所有的依赖库,然后又提供了一个implementation()方 法,用于向List集合中添加依赖库,代码非常简单。

接下来再定义一个dependencies高阶函数,代码如下所示:

  1. fun dependencies(block: Dependency.() -> Unit): List<String> {
  2. val dependency = Dependency()
  3. dependency.block()
  4. return dependency.libraries
  5. }

可以看到,dependencies函数接收一个函数类型参数,并且该参数是定义到Dependency类 中的,因此调用它的时候需要先创建一个Dependency的实例,然后再通过该实例调用函数类 型参数,这样传入的Lambda表达式就能得到执行了。最后,我们将Dependency类中保存的 依赖库集合返回

没错,经过这样的DSL设计之后,我们就可以在项目中使用如下的语法结构了:

  1. dependencies {
  2. implementation("com.squareup.retrofit2:retrofit:2.6.1")
  3. implementation("com.squareup.retrofit2:converter-gson:2.6.1")
  4. }

简单解释一下。由于dependencies函数接收一个函数类型参数,因此这里我们可以 传入一个Lambda表达式。而此时的Lambda表达式中拥有Dependency类的上下文,因此当 然就可以直接调用Dependency类中的implementation()方法来添加依赖库了。

当然,这种语法结构和我们在build.gradle文件中使用的语法结构并不完全相同,这主要是因 为Kotlin和Groovy在语法层面还是有一定差别的。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/266403
推荐阅读
相关标签
  

闽ICP备14008679号