Guillaume Laforge (Гильом Лафорж) — проект менеджер Groovy обявляет о выходе первой беты 1.6 Багфиксы и улучшения.
Были добавлены 2 встроенные аннотации (Groovy полностью поддержирживает все возможности Java5!) : groovy.beans.Bindable и groovy.beans.Vetoable.
Groovy поддерживает аннотации давно, но ранее определения аннотаций могли были быть написаны только на java.
Теперь можно и на groovy.Обе аннотации содержат в себе функионал который призван заменить стандартные Java-интерфейсы java.beans.PropertyChangeListener и java.beans.VetoableChangeListener и избавить разработчика от обилия классов-слушателей (listeners) и декларации дополнительных интерфейсов для бина.
Пример использования аннотации @Bindable
class MyClass {
@Bindable int id
@Bindable String name
def MyClass() {
//this.propertyChange = {
// println it.propertyName + " changed from " + it.oldValue + " to " + it.newValue
//}
}
}
def x = new MyClass()
x.propertyChange = {
println it.propertyName + " changed from " + it.oldValue + " to " + it.newValue
}
x.id = 10
x.name = "Hello"
Результат будет выглядеть так:
groovy Test.groovy
id changed from 0 to 10
name changed from null to Hello
Причем инициализацию свойства propertyChange можно проводить и в конструкторе (см. закомментированный код), но при этом нельзя
восплользоваться статической инициализацией (почему? Не знаю).
Тоесть такой пример работать не будет:
class MyClass {
def propertyChange = {println it}
@Bindable int id
}
def x = new MyClass()
x.id = 10
Среди прочего — очередное увеличение производительности.
class lookup caches позволяют ускорить компиляцию. Причем, чем больше проект, тем явственнее эти ускорения. И вообще, по словам менеджера, последние 10 месяцев команда делала сильный упор на производительность и добилась успехов в микробенчмарках от 150 до 460% увеличения скорости.Кроме увеличения скорости - некоторые новые фичи:
Множественные присваивания
def listOfN(numOfElem) { 0..numOfElem }
def a, b
// variables will contain each successive element of the list
// and variables beyond the count of elements will be null
[a, b] = listOfN(0) // a list of one element
assert a == 0
assert b == null
// if there are more elements, they won't be assigned to any variable
[a, b] = listOfN(9) // a list of ten elements
assert a == 0
assert b == 1
// and you can swap variables with this notation
[a, b] = [b, a]
assert a == 1
assert b == 0
то есть, то, чем хвастались апологеты Ruby.
Авторы просят тестировать бету и делать enjoy