2016-02-21 4 views
0

Я пытаюсь использовать аннотацию @Lazy (http://docs.groovy-lang.org/docs/next/html/documentation/#xform-Lazy) в признаке, чтобы инициализировать объект, только если он используется.groovy: @ Lazy аннотация не работает в признаке

trait MyTrait{ 
    @Lazy String test = { 
    new Exception().printStackTrace() 
    return 'test' 
    }() 
} 

Объект создан независимо от используемого или нет. Я добавил printStackTrace в закрытие инициализации, чтобы убедиться, что я не вызываю переменную непреднамеренно. Объект создается, когда экземпляр класса, реализующего этот признак, создается.

+0

Это неудивительно. Во всех разговорах, которые я слышал о «Чертах» в G2One, Седрик сказал: «Если документация ГОВОРИТ, что она будет работать с« Чертами », большинство аннотаций НЕ будут работать с« Чертами ». – billjamesdev

+0

Вы можете сделать это вручную в качестве обходного пути, проверив существующее значение в пользовательском getter –

ответ

1

Это, кажется, ошибка. @Lazy не работает в значении. Вы должны создать билет с ошибкой с Groovy, чтобы это было исправлено.

Для доказательства этого вопроса, я продлил свой код, чтобы создать тест (запускать как простой заводной скрипт), который показывает, что @Lazy работает для Class, но терпит неудачу утверждения, когда используется на trait:

class MyBase{ 
     @Lazy String test = { 'test' }() 
    } 
    class TestBaseClass extends MyBase{} 
    def tb = new TestBaseClass(); 

    //Dump the current state to output an assert test hasn't been initialized 
    println "Testing @Lazy on a Class.." 
    println tb.dump() 
    assert tb.dump().contains('test=null') //FOR A CLASS, THIS WILL SUCCEED 

    //Access the test property causing initialization 
    println "Accessing the test property." 
    assert tb.test 

    //Dump the current state to output an assert test has now been initialized 
    println tb.dump() 
    assert tb.test == 'test' 

    trait MyTrait{ 
     @Lazy String test = { 'test' }() 
    } 
    class TestClass implements MyTrait{} 
    def t = new TestClass(); 

    //Dump the current state to output an assert test hasn't been initialized 
    println "\nTesting @Lazy on a Trait.." 
    println t.dump() 
    assert t.dump().contains('test=null') //FOR A TRAIT, THIS WILL FAIL THE ASSERTION - A BUG? 

    //Access the test property causing initialization 
    println "Accessing the test property." 
    assert t.test 

    //Dump the current state to output an assert test has now been initialized 
    println t.dump() 
    assert t.test == 'test' 
+0

Если вы предпочитаете, чтобы я открывал билет с Groovy, дайте мне знать, и я был бы рад сделать это за вас. – pczeus

+0

Довольно уверен, что Седрик уже знает, но не стесняйтесь его проносить. Когда Черты вышли, он сказал, что большинство аннотаций AST не будут работать с Чертами, если только документы не обратятся иначе. – billjamesdev

+0

Он сказал, что он должен работать, чтобы улучшить черты работы с аннотациями? Значение этого ожидаемого поведения или возможно, что @Lazy был упущен? – pczeus