groovy-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Christophe Henry <christo...@c-henry.fr>
Subject Inner traits?
Date Sat, 27 Feb 2016 18:29:07 GMT
Traits in Groovy comes as a good replacement to Java's interfaces and, 
in particular Java 8's interfaces that features default methods. Though, 
while working on a project in Groovy, I've come across a 
counter-intuitive and (AFAIK) undocumented limitation of traits: inner 
traits and access to enclosing class' variables.

The case I'm describing may be exotic and have other ways to be solved 
that I'm not aware of. In an Android application, the framework 
instanciates an Application 
<https://developer.android.com/reference/android/app/Application.html> 
object. This class can be overriden to let the developer perform 
initialization steps before the application displays (like list files). 
This Application object is (in theory) unique for an Android 
application. In order to simplify the code, I tried to make some methods 
of this class accessible to any other class implementing an inner trait. 
Here is an example:

public class CustomApplicationextends Application
{
     private static instance @Override void onCreate()
     {
         super.onCreate()
         instance =this }
     
     public trait ApplicationUtilities
     {
         public ContextgetApplicationContext(){return instance.applicationContext }
     }
}

While this piece of code would have worked with an abstract class or a 
Java 8's interface, it throws a compilation error with a trait.

I know I'm trying to do unnatural things with this language but is there 
any reason for this limitation and is there a plan to implement a 
feature like this in future releases?

Regards,
Henry Christophe

Mime
View raw message