| [[Android]] |
| == Android Support |
| With Groovy 2.4, you can write Android applications in Groovy! |
| |
| A quick link:{DOCS_BASEURL}/html/documentation/tools-groovyc.html#section-android[getting |
| started guide] is available on the Groovy website. |
| |
| To build your Android applications with the Groovy support, you’ll be |
| able to use |
| the link:https://github.com/groovy/groovy-android-gradle-plugin[Gradle Groovy Android plugin]. |
| |
| The link:https://github.com/Arasthel/SwissKnife[SwissKnife] library builds |
| upon the Groovy support to offer very useful AST transformations that |
| kill the usual Android boilerplate code, for instance for dealing with |
| UI events, with logic to be run in background threads, or make objects |
| easily "parcelables", etc. |
| |
| To further understand the new Android support, you can read the |
| following articles by Cédric Champeau: |
| |
| * Introduction: link:http://melix.github.io/blog/2014/06/grooid.html[http://melix.github.io/blog/2014/06/grooid.html] |
| * Technical details: link:http://melix.github.io/blog/2014/06/grooid2.html[http://melix.github.io/blog/2014/06/grooid2.html] |
| |
| And discover presentations on the Android support: |
| |
| * link:https://speakerdeck.com/melix/groovy-and-android-a-winning-pair-1[Groovy and Android, a winning pair] by Cédric Champeau |
| * link:https://speakerdeck.com/glaforge/groovy-on-android-groovy-grails-exchange-2014[Groovy on Android] by Guillaume Laforge |
| |
| The work on the Android support also lead to various optimizations in |
| terms of bytecode generation, as explained further down, as well as, for |
| instance, improving the handling of overloaded setters |
| (link:https://issues.apache.org/jira/browse/GROOVY-2049[GROOVY-2049],link:https://issues.apache.org/jira/browse/GROOVY-6084[GROOVY-6084], |
| link:https://issues.apache.org/jira/browse/GROOVY-2500[GROOVY-2500]) |
| which are frequent in the Android SDK. |
| |
| [[Groovy2.4releasenotes-Performanceimprovementsandreducedbytecode]] |
| == Performance improvements and reduced bytecode |
| |
| This new major release of Groovy has seen various improvements across |
| the board to reduce the quantity of bytecode produced, to lower memory |
| consumption of internal data structures, fine tune bytecode for better |
| performance. |
| |
| Here are some of the tickets related to the topic: |
| |
| * Cheaper comparison operations |
| (link:https://issues.apache.org/jira/browse/GROOVY-7194[GROOVY-7194]) |
| * Reduced memory consumption for `respondsTo()` |
| (link:https://issues.apache.org/jira/browse/GROOVY-7178[GROOVY-7178]) |
| * For fully statically compiled classes, MOP related generated methods |
| are not needed |
| (link:https://issues.apache.org/jira/browse/GROOVY-6990[GROOVY-6990]) |
| * Remove unneeded inner class distributor methods when no inner classes |
| are present (link:https://issues.apache.org/jira/browse/GROOVY-6993[GROOVY-6993]) |
| * Removal of the timestamp in Groovy classes |
| (link:https://issues.apache.org/jira/browse/GROOVY-6308[GROOVY-6308]) |
| * Optimization of primitive type conversions with the as operator |
| (link:https://issues.apache.org/jira/browse/GROOVY-7140[GROOVY-7140]) |
| |
| [[Groovy2.4releasenotes-TraitsSelfTypeannotation]] |
| == Traits @SelfType annotation |
| |
| Sometimes, it’s desired to be able to restrict a trait’s application so |
| that it can only be applied to subclasses of a certain type. That’s what |
| the `@SelfType` annotation is for |
| (link:https://issues.apache.org/jira/browse/GROOVY-7134[GROOVY-7134]). |
| |
| Here’s a concrete example of `@SelfType` in action. |
| |
| [source,groovy] |
| ---- |
| import groovy.transform.* |
| |
| class Component { |
| void doSomething() { |
| println "Done!" |
| } |
| } |
| |
| @SelfType(Component) |
| @TypeChecked |
| trait ComponentDecorator { |
| void logAndDoSomething() { |
| println "Going to do something" |
| doSomething() |
| } |
| } |
| |
| class ConcreteComponent |
| extends Component |
| implements ComponentDecorator {} |
| |
| def c = new ConcreteComponent() |
| c.logAndDoSomething() |
| ---- |
| |
| The `ComponentDecorator` trait is calling the `doSomething()` method from |
| the `Component` sub-class to which it will be applied. If you don’t |
| specify the `@SelfType(Component)` annotation, when using static type |
| checking or static compilation, the compiler will throw a compilation |
| error as it wouldn’t know where the `doSomething()` method would be coming |
| from. With the annotation, you instruct the compiler to figure out that |
| this trait will only be applied to child of Component that will have |
| that method available. `@SelfType` is interesting in the context of static |
| type checking or compilation, but is not needed if your code is dynamic |
| as the resolution will take place at runtime as usual. |
| |
| [[Groovy2.4releasenotes-GDKimprovements]] |
| == GDK improvements |
| |
| * `System.currentTimeSeconds()` to get the current time in seconds |
| (link:https://issues.apache.org/jira/browse/GROOVY-6294[GROOVY-6294]) |
| * `List#getIndices()` to get a range representing the indices of the |
| elements of the list |
| (link:https://issues.apache.org/jira/browse/GROOVY-7171[GROOVY-7171]) |
| * More collection related methods are moved to iterator-based variants |
| to apply to all iterable collection types |
| (link:https://issues.apache.org/jira/browse/GROOVY-6863[GROOVY-6863]) and missing |
| methods have been added like `init()`, `dropRight()`, `takeRight()` |
| (link:https://issues.apache.org/jira/browse/GROOVY-6867[GROOVY-6867]) |
| * `Iterable` gets `disjoin()`, `minus()` and `toSpreadMap()` methods |
| (link:https://issues.apache.org/jira/browse/GROOVY-6920[GROOVY-6920]) |
| * Refinements and concistency for existing collection methods, |
| leveraging iterable approaches for stream-like traversals, consistency |
| for mutation in place vs new collection creation, minor optimizations, |
| etc. (link:https://issues.apache.org/jira/browse/GROOVY-6945[GROOVY-6945]) |
| * New `List#removeAt(index)` and `Collection#removeElement(Object)` methods |
| (link:https://issues.apache.org/jira/browse/GROOVY-6952[GROOVY-6952]) |
| * `Iterable` gets a `size()` method like iterators |
| (link:https://issues.apache.org/jira/browse/GROOVY-7085[GROOVY-7085]) |
| |
| [[Groovy2.4releasenotes-ASTtransformations]] |
| == AST transformations |
| |
| * The `@ToString` transformation offers an `includeSuperProperties` |
| parameter so properties from the super class are also present in the |
| string representation |
| (link:https://issues.apache.org/jira/browse/GROOVY-7161[GROOVY-7161]) |
| * You can define the compilation phase for the `@ASTTest` transformation |
| for testing your AST transformations |
| (link:https://issues.apache.org/jira/browse/GROOVY-6968[GROOVY-6968]) |
| * `@Synchronized` supports explicit static locks to be used by instance |
| methods if needed |
| (link:https://issues.apache.org/jira/browse/GROOVY-7030[GROOVY-7030]) |
| * Clean up generated code for `@AutoExternalizable` |
| (link:https://issues.apache.org/jira/browse/GROOVY-6889[GROOVY-6889]) and |
| `@EqualsAndHashCode` |
| (link:https://issues.apache.org/jira/browse/GROOVY-6893[GROOVY-6893]) the when |
| using `@CompileStatic` |
| * `@Builder`’s default and initializer strategies improved Java |
| integration (link:https://issues.apache.org/jira/browse/GROOVY-6875[GROOVY-6875]) |
| * `@PackageScope` allowed on constructors too |
| (link:https://issues.apache.org/jira/browse/GROOVY-6839[GROOVY-6839]) |
| |
| [[Groovy2.4releasenotes-Groovyshimprovements]] |
| == Groovysh improvements |
| |
| The venerable Groovysh shell continues seeing some useful improvements: |
| |
| * Groovysh supports custom .rc and .profile scripts to be loaded on |
| startup (link:https://issues.apache.org/jira/browse/GROOVY-6943[GROOVY-6943]) |
| * completion of instanceof statements |
| (link:https://issues.apache.org/jira/browse/GROOVY-7200[GROOVY-7200]) |
| * completion of static members only displayed in a static context |
| (link:https://issues.apache.org/jira/browse/GROOVY-6622[GROOVY-6622]) |
| * completion candidates in color |
| (link:https://issues.apache.org/jira/browse/GROOVY-6563[GROOVY-6563]) |
| * with :set interpreterMode true, you can let Groovysh to let you see |
| and use locally-defined variables after further line executions |
| (link:https://issues.apache.org/jira/browse/GROOVY-6623[GROOVY-6623]) |
| * the :load command supports file names containing spaces |
| (link:https://issues.apache.org/jira/browse/GROOVY-6942[GROOVY-6942]) |
| * make arguments and flags consistent with the groovy command and allow |
| the launch of a script on startup passed as argument and continue |
| execution of Groovysh |
| (link:https://issues.apache.org/jira/browse/GROOVY-6754[GROOVY-6754]) |
| * make it easier to subclass Groovysh for reuse as an embedded shell |
| (link:https://issues.apache.org/jira/browse/GROOVY-6752[GROOVY-6752]) |
| |
| [[Groovy2.4releasenotes-Miscellaneous]] |
| == Miscellaneous |
| |
| * Allow Ant targets declaration by AntBuilder without immediate |
| execution (link:https://issues.apache.org/jira/browse/GROOVY-2900[GROOVY-2900]) |
| * Make `NamespaceBuilder` automatically detect namespace declarations |
| (link:https://issues.apache.org/jira/browse/GROOVY-6890[GROOVY-6890]) |
| * Implement and register type checking extensions as subclasses of |
| `TypeCheckingExtension` |
| (link:https://issues.apache.org/jira/browse/GROOVY-6739[GROOVY-6739]) |
| * `ConfigObject` overrides `toString()` and offers a `prettyPrint()` method |
| (link:https://issues.apache.org/jira/browse/GROOVY-7183[GROOVY-7183]) |
| * Improved type checking for certain GDK methods |
| (link:https://issues.apache.org/jira/browse/GROOVY-6966[GROOVY-6966]) |
| * Grape is using JCenter through HTTP first for resolving dependencies, |
| and now HTTPS is used for better security |
| (link:https://issues.apache.org/jira/browse/GROOVY-7152[GROOVY-7152]) |
| * Parameters of `@DelegatesTo` and `@ClosureParams` are better aligned |
| (link:https://issues.apache.org/jira/browse/GROOVY-6956[GROOVY-6956]) |
| * Multiple labels are supported on the same statement |
| (link:https://issues.apache.org/jira/browse/GROOVY-3298[GROOVY-3298]) |
| |
| [[Groovy2.4releasenotes-Breakingchanges]] |
| == Breaking changes |
| |
| A few issues fixed might also be considered breaking changes in some |
| situations: |
| |
| * Malformed class names for closures in inner classes |
| (link:https://issues.apache.org/jira/browse/GROOVY-5351[GROOVY-5351]) |
| * Avoid creation of MOP methods in static compilation |
| (link:https://issues.apache.org/jira/browse/GROOVY-6990[GROOVY-6990]) |
| * Reduce memory consumption for respondsTo() |
| (link:https://issues.apache.org/jira/browse/GROOVY-7178[GROOVY-7178]) |
| * Making Groovysh more easily extendable and embeddable |
| (link:https://issues.apache.org/jira/browse/GROOVY-6752[GROOVY-6752]) |
| |
| [[Groovy2.4releasenotes-Moreinformation]] |
| == More information |
| |
| You can browse all the link:../changelogs/changelog-2.4.0.html[tickets closed for Groovy 2.4 in JIRA]. |