Jochen,
On 3. 4. 2016, at 7:23, Jochen Theodorou <[email protected]> wrote:
> On 01.04.2016 03:48, OC wrote:
>> playing with possibilities of the i/i pattern, I have found one can install
>> a static property to an interface, and then use the property all right --
>> see a proof-of-concept below.
>>
>> Since it might be used e.g. to create instances or to get a factory through
>> public API based on interfaces (which would otherwise not be possible
>> without exposing the implementation class), this is truly interesting.
>>
>> The question is: can I rely on this rather arcane behaviour, that it will
>> not be broken in future Groovy versions?
>
> if you want to be really sure it will continue working it is best if you
> contribute a test case ;) But I see no plans to change that, especially with
> java8 being able to define static methods and thus static properties.
Thanks a lot!
> [...]
>> def body={-> "<$name in $delegate>" }
>> delegate.metaClass.static."$getter"=body
>> delegate."$getter"() // I wonder why just "body()" does not work?!?
>
> no idea why not... but you can always try body.call() instead.
Same as with body():
===
6 /tmp> <q.groovy
class q {
static main(av) {
ExpandoMetaClass.enableGlobally()
Root.metaClass.static.propertyMissing={ name ->
String getter="get${name.capitalize()}"
def body={-> "<$name in $delegate>" }
delegate.metaClass.static."$getter"=body
body.call() // same problem with body(); delegate."$getter"() would work
though
}
println "- ${Root.weird}"
}
}
interface Root {}
7 /tmp> groovy q.groovy
Caught: groovy.lang.MissingMethodException: No signature of method:
java.io.StringWriter.capitalize() is applicable for argument types: () values:
[]
groovy.lang.MissingMethodException: No signature of method:
java.io.StringWriter.capitalize() is applicable for argument types: () values:
[]
at q$_main_closure1.doCall(q.groovy:5)
at q.main(q.groovy:10)
8 /tmp>
===
Thanks again and all the best,
OC