升级脚本以兼容Groovy 3
Groovy 3引入了一系列可能影响Collibra Groovy工作流脚本的重大更改。亚愽视频你可以参考完整的名单Groovy 3发布说明.有两个突破性的变化最有可能影响Collibra的工作流程:亚愽视频
- 如果一个Groovy switch语句有一个默认分支,那么它必须是最后一个分支。
- Groovy现在更符合JavaBeans规范的一种边缘情况场景,涉及名称以大写字母开头的任何字段(groovy - 9618).
- 枚举不能有非私有构造函数。
- 要使用接口“Function”作为参数,必须输入它,例如:
_methodHandler(函数
.requiredFunction)
在我们将Collibra升级到包含groovy 3的版本之前,您可以将工作流groovy脚本代码升级到与这些更改兼容。亚愽视频
Change Groovy switch语句
如果一个Groovy 3 switch语句有一个默认分支,那么它必须是最后一个分支。这意味着您不能再将默认分支放在除了分支列表的最后一个位置之外的任何其他位置。
以下代码不能在Groovy 3下编译:
switch(yourVariable) {default: //默认动作中断情况'a': //设置动作中断}
为了纠正上面的代码,把默认分支放在最后:
switch(yourVariable) {case 'a': // case动作中断default: //默认动作中断}
您的代码将与所有分支的行为完全相同打破
语句,这样每个分支都是孤立的,不会影响其他分支。
切换失败
当分支没有打破
语句,这样就可以执行多个分支,而不仅仅是匹配的那个。
交换机故障示例:
def result = "" switch(yourVariable) {default: result += "default " //由于没有break语句,"case a"将在下一个case 'a'执行:result += "a " //由于没有break语句,"case b"将在下一个case 'b'执行:result += "b"}
当yourVariable
有价值“一个”,结果
变量将等于“b”.当yourVariable
有价值“b”,结果
变量将等于“b”.在所有其他情况下,结果
变量将等于" default a b ".
要使代码在Groovy 3下编译,请将默认分支放在最后。然而,为了获得与直通开关相同的结果,你还必须调整其余的代码:
Groovy 3切换切换等效:
def result = "" switch(yourVariable) {case 'a': result = "a b" break case 'b': result = "b" break default: result = "default ab " break}
调整Groovy JavaBeans规范兼容性更改
Groovy 3更符合JavaBeans规范的一个边缘情况场景,该场景涉及名称以大写字母开头的任何字段。此更改会对属性的处理产生影响。
Groovy特性
属性的定义依据Groovy公共文档是:
属性是类的外部可见特性。Java中的典型方法是遵循JavaBeans规范中概述的约定,即使用私有支持字段和getter /setter的组合来表示属性,而不是仅仅使用公共字段来表示这些特性(这提供了更有限的抽象并限制了重构的可能性)。Groovy遵循这些相同的约定,但提供了一种更简单的方法来定义属性。
下面的代码示例将生成以下内容:
一个支持
private字符串名称
场,getName和一个setName方法。一个支持
私人int
场,getAge和一个setAge方法。
类Person{字符串名称int年龄}
按照惯例,即使没有支持字段,只要有符合Java Beans规范的getter或setter, Groovy也能识别属性。
class PseudoProperties{//1。a伪属性"name" void setName(字符串名称){}String getName() {} //一个伪只读属性"age" int getAge() {42} //3a伪只写属性"groovy" void setGroovy(boolean groovy) {}} def p = new PseudoProperties() p.name = 'Foo' // uses (1) assert p.age == 42 // uses (2) p.groovy = true // uses (3)
Groovy 3突破性变化
在Groovy 3中,对以大写字母开头的属性的处理已经变得更加符合JavaBeans规范。
属性映射到访问器方法的方式已经改变。在groovy 2中,在某些场景中可以访问字段而不是访问器方法,如下所示:
Groovy 2
|
Groovy 3
|
当你使用静态属性时,也会出现类似的情况:
Groovy 2
|
Groovy 3
|
这种破坏性的更改不会影响未覆盖访问器方法的类。
建议
为了使现有的工作流脚本与Groovy 3兼容,我们建议使用小写的属性名,除非属性名都是大写的:
class A {private String X = 'fieldX' private String XML = 'fieldXML' String getX() {'X'} String getXML() {'XML'}} new A()。使用{assert x == ' x ' //而不是使用大写的x属性assert XML == 'XML' //在这种情况下使用XML属性是唯一的方法}