今天在写脚本的时候发现一个奇怪的错误。经过猜想验证,发现原来Groovy过于灵活了,算是重复踩了之前的坑。Groovy特性描述如下:
当Groovy脚本调用getFun()和setFun()方法时,会默认给这个类有一个FunTester的属性。反过来,如果这个类有Fun这个属性,那么get和set方法是不用显式写出来的。
本来这是个好事情,一方面其实可以免去多余代码,一方面更容易收拢入口方法(因为直接访问属性、修改属性也是有限调用get和set方法)。
但是就是这个特性让我下面的代码报错了。
代码语言:javascript复制 StringBuilder sb = new StringBuilder()
for (int i = 0; i < 3; i ) {
sb.append("a" i)
output(sb.toString())
sb.setLength(0)
}
其中java.lang.AbstractStringBuilder#setLength方法是用来裁剪StringBuilder对象内容的,如果参数为0,实际的功效就是清空。
官方的描述为:
setLength(int newLength)
是 AbstractStringBuilder
类中的一个方法,用于设置字符串的长度。具体来说,它有以下作用:
- 如果
newLength
小于当前字符串的长度,则字符串将被截断为指定的长度newLength
。 - 如果
newLength
大于当前字符串的长度,则在字符串末尾填充空字符('