在上一篇的最后我们看到了最后 看到的关于android的内部的Extension
我们是否豪气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()
}
}
运行结果
查找和遍历
NamedDomainObjectContainer 既然是一个容器类,与之相应的必然会有查找容器里的元素和遍历容器的方法:
//遍历
void all(Closure action)
//查找
<T> T getByName(String name)
//查找
<T> T findByName(String name)
遍历前面的例子已经有了。