美文网首页
Gradle NamedDomainObjectContaine

Gradle NamedDomainObjectContaine

作者: 刘景昌 | 来源:发表于2020-12-11 18:04 被阅读0次

在上一篇的最后我们看到了最后 看到的关于android的内部的Extension


image.png

我们是否豪气NamedDomainObjectContainer这个是个什么东西呢,我们就在这篇文章中研究一下
先看一下官方解释
Implementations may use different strategies for creating new object instances
为实现你不同策略的所创建的容器
它的主要功能有:
(1)它能够通过DSL(在Gradle脚本中)创建指定 type 的对象实例;
(2)指定的 type 必须有一个 public 构造函数,且必须带有一个 String name 的参数,type 类型的领域对象必须有名为“name”的属性;
(3)它是一个实现了 SortedSet 接口的容器,所以所有领域对象的 name 属性值都必须是唯一的,在容器内部会用 name 属性来排序;
下面我们来看一下如何创建和使用
NamedDomainObjectContainer 需要通过 Project.container(...) API 来创建,其定义为:

<T> NamedDomainObjectContainer<T> container​(Class<T> type)
<T> NamedDomainObjectContainer<T> container​(Class<T> type, NamedDomainObjectFactory<T> factory)
<T> NamedDomainObjectContainer<T> container​(java.lang.Class<T> type, Closure factoryClosure

下面是一个具体的例子

//声明一个测试的DomainBean
class TestDomainBean {

    //这是一个必须要有的属性并且申明后不要修改
    String name

    String msg

    //构造函数必须有一个 name 参数
    public TestDomainBean(String name) {
        this.name = name
    }

    void msg(String msg) {
        this.msg = msg
    }

    String toString() {
        return "name = ${name}, msg = ${msg}"
    }
}

//创建一个扩展
class TestExtensionBean {

    //定义一个 NamedDomainObjectContainer 属性
    NamedDomainObjectContainer<TestDomainBean> domainNOC;

    public TestExtensionBean(Project project) {
        //使用 project.container创建 project.container
        NamedDomainObjectContainer<TestDomainBean> domainObjs = project.container(TestDomainBean)
        domainNOC = domainObjs
    }

    //让其支持 Gradle DSL 语法
    void testDomain(Action<NamedDomainObjectContainer<TestDomainBean>> action) {
        action.execute(domainNOC)
    }

    void test() {
        //遍历命名领域对象容器,打印出所有的领域对象值
        domainNOC.all { data ->
            println data
        }
    }
}

//创建一个名为 test 的 Extension
def testExt = getExtensions().create("test", TestExtensionBean, project)

test {
    testDomain {
        domainbean1 {
            msg "xyy"
        }
        domainbean2 {
            msg "ybm"
        }
        domainbean3 {
            msg "saas"
        }
    }
}

task myTask {
    doLast {
        testExt.test()
    }

}

运行结果


image.png
查找和遍历

NamedDomainObjectContainer 既然是一个容器类,与之相应的必然会有查找容器里的元素和遍历容器的方法:

//遍历
void all(Closure action)
//查找
<T> T getByName(String name)
//查找
<T> T findByName(String name)

遍历前面的例子已经有了。

相关文章

网友评论

      本文标题:Gradle NamedDomainObjectContaine

      本文链接:https://www.haomeiwen.com/subject/famywktx.html