Introduce Groovy 2.3 trait

Preview:

DESCRIPTION

Trait is new feature which is introduced to Groovy 2.3. This presentation explain short summary of trait and how to use it, what purpose it suit for.

Citation preview

  • 1. GroovyTrait 2014/06/20 JGGUG G*Workshop NTT 14621

2. Copyright (C) 2014 NTT Software Corp. (@uehaj) NTT()Grails JGGUG(Grails/Groovy) :GROOVY( ),Grails() Gr GroovyServ, LispBuilder, GVM(JVM written in Groovy) 14621 3. Copyright (C) 2014 NTT Software Corp. Trait Self, Squeak Smalltalk, PHP, Rust, D,Scala...Trait C++Traits / Groovy 2.3(?) GroovytraitScala 14621 4. Copyright (C) 2014 NTT Software Corp. Groovytrait oo (Java8Default Method) () 14621 5. Copyright (C) 2014 NTT Software Corp. trait trait T { ... } Trait def x = new T() // Trait class C implements T {} // like interface def y = new C() // OK Trait def z = new String() as T def z2 = new String().withTraits(T1,T2) assert ! (z instanceof String) assert z instanceof T 14621 6. Copyright (C) 2014 NTT Software Corp. trait trait T { ... } Trait def x = new T() // Trait class C implements T {} // like interface def y = new C() // OK Trait def z = new String() as T def z2 = new String().withTraits(T1,T2) assert ! (z instanceof String) assert z instanceof T as Interface Groovy 14621 7. Copyright (C) 2014 NTT Software Corp. traitHelloable{//hello voidhello(){ println"hello"+this.toString() } voidhello2(){ println"hello"+proxyTarget.toString() } } classWorldimplementsHelloable{ StringtoString(){"world"} } x=newWorld() x.hello()//==>helloworld y="abc"asHelloable y.hello()//==>helloString1_groovyProxy@5560a7b1 z="def"asHelloable z.hello2()//==>hellodef Trait Trait String 14621 8. Copyright (C) 2014 NTT Software Corp. proxyTarget Trait def x = new String() def y = x.withTraits(T1,T2) assert x == y.proxyTarget assert y.proxyTarget instanceof String http://jira.codehaus.org/browse/GROOVY-6692 14621 9. Copyright (C) 2014 NTT Software Corp. traitsuper Traitsuper? trait superTrait traitsimplements trait super Trait super.super 14621 10. Copyright (C) 2014 NTT Software Corp. traitA{Stringwhoami(){"A->"+super.whoami()}} traitB1extendsA{Stringwhoami(){"B1->"+super.whoami()}}; traitB2extendsA{Stringwhoami(){"B2->"+super.whoami()}}; traitC1extendsB1{Stringwhoami(){"C1->"+super.whoami()}}; traitC2extendsB1{Stringwhoami(){"C2->"+super.whoami()}}; traitC3extendsB2{Stringwhoami(){"C3->"+super.whoami()}}; traitC4extendsB2{Stringwhoami(){"C4->"+super.whoami()}}; classDimplementsC4,C3,A,C2,C1{Stringwhoami(){"D"}} classEextendsDimplementsC1,C2,C3,C4{} m=newE() printlnm.whoami() //C4->B2->A->C3->C2->B1->C1->D 14621 11. Copyright (C) 2014 NTT Software Corp. (super) extends (implements) extends C1 C2 C3 C4 B1 B2 A D 14621 12. Copyright (C) 2014 NTT Software Corp. (super) extends (implements) extends C1 C2 C3 C4 B1 B2 A D E Dtrait C1C4 E class E extends D implements C1,C2,C3,C4 14621 13. Copyright (C) 2014 NTT Software Corp. (super) extends (implements) extends C1 C2 C3 C4 B1 B2 A D E Dtrait C1C4 E class E extends D implements C1,C2,C3,C4 E 14621 14. Copyright (C) 2014 NTT Software Corp. (super) extends (implements) extends C1 C2 C3 C4 B1 B2 A D E Dtrait C1C4 E class E extends D implements C1,C2,C3,C4 E Scala 14621 15. Copyright (C) 2014 NTT Software Corp. (super) extends (implements) extends C1 C2 C3 C4 B1 B2 A D E Dtrait C1C4 E class E extends D implements C1,C2,C3,C4 E Scala 14621 16. Copyright (C) 2014 NTT Software Corp. (super) extends (implements) extends C1 C2 C3 C4 B1 B2 A D E Dtrait C1C4 E class E extends D implements C1,C2,C3,C4 E Scala 14621 17. Copyright (C) 2014 NTT Software Corp. (super) extends (implements) extends C1 C2 C3 C4 B1 B2 A D E Dtrait C1C4 E class E extends D implements C1,C2,C3,C4 E Scala 14621 18. Copyright (C) 2014 NTT Software Corp. (super) extends (implements) extends C1 C2 C3 C4 B1 B2 A D E Dtrait C1C4 E class E extends D implements C1,C2,C3,C4 E Scala 14621 19. Copyright (C) 2014 NTT Software Corp. (super) extends (implements) extends C1 C2 C3 C4 B1 B2 A D E Dtrait C1C4 E class E extends D implements C1,C2,C3,C4 E Scala 14621 20. Copyright (C) 2014 NTT Software Corp. (super) extends (implements) extends C1 C2 C3 C4 B1 B2 A D E Dtrait C1C4 E class E extends D implements C1,C2,C3,C4 E Scala 14621 21. Copyright (C) 2014 NTT Software Corp. (super) extends (implements) extends C1 C2 C3 C4 B1 B2 A D E Dtrait C1C4 E class E extends D implements C1,C2,C3,C4 E Scala 14621 22. Copyright (C) 2014 NTT Software Corp. (super) extends (implements) extends C1 C2 C3 C4 B1 B2 A D E Dtrait C1C4 E class E extends D implements C1,C2,C3,C4 E Scala 14621 23. Copyright (C) 2014 NTT Software Corp. (super) extends (implements) extends C1 C2 C3 C4 B1 B2 A D E Dtrait C1C4 E class E extends D implements C1,C2,C3,C4 D traitimplements E super E Scala 14621 24. Copyright (C) 2014 NTT Software Corp. traitA{Stringwhoami(){"A->"+super.whoami()}} traitB1extendsA{Stringwhoami(){"B1->"+super.whoami()}}; traitB2extendsA{Stringwhoami(){"B2->"+super.whoami()}}; traitC1extendsB1{Stringwhoami(){"C1->"+super.whoami()}}; traitC2extendsB1{Stringwhoami(){"C2->"+super.whoami()}}; traitC3extendsB2{Stringwhoami(){"C3->"+super.whoami()}}; traitC4extendsB2{Stringwhoami(){"C4->"+super.whoami()}}; classDimplementsC4,C3,A,C2,C1{Stringwhoami(){"D"}} classEextendsDimplementsC1,C2,C3,C4{} m=newE() printlnm.whoami() //C4->B2->A->C3->C2->B1->C1->D Dimplementstraits Esuper 14621 25. Copyright (C) 2014 NTT Software Corp. (1) classEextendsDimplements C1,C2,C3,C4{} C1 B2 B1 C4 C2 C3 E D A traitClass ( @ForceOverride ) super Dsuper 14621 26. Copyright (C) 2014 NTT Software Corp. (2) classEimplementsC1,C2,C3,C4{} C1 B2 B1 C4 C2 C3 E Object(?) A Dextendstrait( C1) C1 C1super.whoami() 14621 27. Copyright (C) 2014 NTT Software Corp. Stackable Trait Trait 14621 28. Copyright (C) 2014 NTT Software Corp. Wiki(1) traitBold{ Stringconvert(Strings){ super.convert(s).replaceAll(/**([^*]*)**/,'$1') } } traitHeading{ Stringconvert(Strings){ super.convert(s).replaceAll(/(?m)^(#+)?(.*)$/){g0,g1,g2-> ""+g2+""+g1.size()+">" } } } traitUL{ Stringconvert(Strings){ super.convert(s).replaceAll(/(?m)(^s*[^*]*n)(s**)/){g0,g1,g2-> g1+"

  • n"+g2 }.replaceAll(/(?m)(^s**.*n)(s*[^*]*n)/){g0,g1,g2-> g1+"

n"+g2 }.replaceAll(/(?m)^s**s*(.*)$/,"$1") } } classHtmlConverter{ Stringconvert(Strings){ ""+s+"nn" } } 14621 29. Copyright (C) 2014 NTT Software Corp. Wiki(2) classWikiEngine1extendsHtmlConverterimplementsBold,Heading,UL{} classWikiEngine2extendsHtmlConverterimplementsUL,Bold,Heading{} printlnnewWikiEngine1().convert(text) printlnnewWikiEngine2().convert(text) printlnnewHtmlConverter().withTraits(Bold,Heading,UL).convert(text) printlnnewHtmlConverter().withTraits(UL,Bold,Heading).convert(text) ##thisisHeading1 #thisisHeading2 Thisissampledocumentforwiki engine. Ifyouwanto**emphasize**,use **This**markup. #Thisisheading3 Thisissampledocumentforwiki engine. *list1 *list2 *list3 Thisisend. **hoge** thisisHeading1 thisisHeading2 Thisissampledocumentforwikiengine. Ifyouwantoemphasize,use Thismarkup. Thisisheading3 Thisissampledocumentforwikiengine.

  • list1
  • list2
  • list3

Thisisend. hoge

  • *hoge**

14621 30. Copyright (C) 2014 NTT Software Corp. Groovytraitmixin () () read from le + write to le => read write le GroovyJavaTrait DI? DCI? Scala 14621 31. Copyright (C) 2014 NTT Software Corp. http://beta.groovy-lang.org/docs/latest/html/documentation/ #_traits http://www.artima.com/scalazine/articles/ stackable_trait_pattern.html http://www.atmarkit.co.jp/ait/articles/1206/20/ news137_3.html http://groovyconsole.appspot.com/script/5738600293466112 http://groovyconsole.appspot.com/script/5653164804014080 OracleJavaOracle Corporation 14621