Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

Groovy Mixin Proposal

Take the following classes.

Wombat.groovy
Mobile.groovy
FighterType.groovy

The Wombat class as defined simply defines a few things. By defining those things it makes it possible for it to mixin other things – notable Mobile and FighterType.

Now, how to mix these things together...

Static Mixing:

At compile time mixin information can be provided, in which case all instances of the class receiving the mixin have the mixed traits

Wombat.groovy

This says that all instances of Wombat are Mobile. An alternate for this is to put it on the class declaration line:

Wombat.groovy

Which borrows the keyword/syntax from Scala. I lean towards the first because Java allows you to cast to things in the type declaration, and you specifically cannot cast to Mobile in this case. The mixin(Wombat) would be treated as an initializer block

All methods defined in Mobile would be added to Wombat. The type information is not. If a method is already defined in Wombat (such as getTurningSpeed()) the mixin method is not mixed in. Similarly, if multiple mixins are specified, the first time a method is defined is the one that is used.

Instance variables do not cross declarations. That means that Wombat cannot directly access heading, it must go through getHeadin(). Similarly, the mixed in class cannot access instance variables on the class it is being mixed into.

Mixins can define their own internal instance variables, only accessible to the mixed in class itself (heading, locationX, locationY).

"this" refers to the same instance whether used in the mixed in class or the mixed class.

Methods the mixed in instance requires from the host instance can be declared abstract. It is worth considering if they can also be left undeclared and then invoked via dynamic dispatch – this is open for discussion. It is useful to document the methods the mixin requires, though, so I used the abstract declaration here.

Dynamic Mixing:

Sample.groovy

or

Sample.groovy

adds the FighterType mixin to the Wombat instance referenced by George. FighterType is only available on that particular instance, so:

Wombat.groovy

Singleton Method Mixin:

Adding a single method at runtime has a bit of syntactic sugar, as follows:

Sample.groovy

Paramaterized Mixing:

The mixin class is allowed to use a constructor which takes args, so:

MyMixin.groovy

which would initialize the mixin state via the ctor giving it anArg as a lone ctor arg

  • No labels