2015-05-30 2 views
2

Я пишу юнит-тесты, когда я случайно обнаружил, что в заводной ниже является truenull.collect() возвращает пустой список

null.collect({ //Anything }) == [] 

я не мог найти причину этого. Какая часть groovy дает такое поведение? Я проверил NullObject, но у этого метода сбора нет. Итак, как это происходит?

+0

['Object.collect'] (http://docs.groovy-lang.org/latest/html/groovy-jdk/java/lang/Object.html#collect (groovy.lang.Closure)), может быть? –

ответ

1

collect метод добавляется ко всем объектам во время выполнения с помощью DefaultGroovyMethods класса, см here, так что каждый класс имеет эти методы:

class Lol {} 

assert new Lol().collect({}) == [null] 
assert new Lol().iterator().toList() //is not empty, contains 'this' 
1

В заводной null имеет iterator() метод, который возвращает пустой итератор. Вызов collect по нуле совпадает с null.iterator().collect({/*whatever*/}), и поэтому это будет [].

См. Комментарий на этом bug report.

+0

Зачем требовать метод вызова метода iterator() на null? –

+1

'null' является экземпляром' org.codehaus.groovy.runtime.NullObject', а не тем же 'null', что и в java. Он также имеет методы из 'DefaultGroovyMethods', добавленные во время выполнения (см. Мой ответ). Groovy не проверяет, является ли экземпляр нулевым, но juts вызывает метод, он сделан, чтобы избежать NPE. – Opal

+0

Я проверил DefaultGroovyMethods -> collect. Это вызывает в нем итератор. Вот почему итератор вызывается. –

Смежные вопросы