Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Groovy constructors

I'm having a problem while using constructors with a Groovy class.

I have a class Data in a file called Data.groovy with an inner class ContentEntry. I want to initialize ContentEntry instances from a Data method:

static void initContent(nid, uid)
{
    curContent = new ContentEntry()
    curContent.nid = nid;
    curContent.uid = uid;
}

with ContentEntry defined as:

class ContentEntry
{
    public int nid, uid 
    private tags = [:]

    public ContentEntry()
    {

    }

    ContentEntry(int nid, int uid)
    {
        this.nid = nid
        this.uid = uid
    }

    //omitted rest of the class

But when running the project it gives me the following error:

Exception in thread "main" org.codehaus.groovy.runtime.metaclass.MethodSelectionException:
Could not find which method <init>() to invoke from this list:
public it.softit.Data$ContentEntry#<init>(it.softit.Data, int, int)
public it.softit.Data$ContentEntry#<init>(it.softit.Data)

It's like if constructors implicitly need an instance of the outer class passed as a parameter. I'm wondering why..

like image 949
Jack Avatar asked Jan 11 '10 16:01

Jack


People also ask

How do I create a constructor in Groovy?

To create an object by using positional parameters, the respective class needs to declare one or more constructors. In the case of multiple constructors, each must have a unique type signature. The constructors can also added to the class using the groovy. transform.

How do you make a POJO on Groovy?

To do this, go to the context menu of a table (or several tables) and press Scripted Extension → Generate POJO. groovy. Choose a destination folder, and that's it! The class-file is ready.

What does [:] mean in Groovy?

[:] creates an empty Map. The colon is there to distinguish it from [] , which creates an empty List. This groovy code: def foo = [:]

What is MetaClass in Groovy?

A MetaClass within Groovy defines the behaviour of any given Groovy or Java class. The MetaClass interface defines two parts. The client API, which is defined via the extend MetaObjectProtocol interface and the contract with the Groovy runtime system.


2 Answers

The requirement that all (non-static) inner classes need a reference to their outer class is imposed by Java, rather than Groovy. If you instantiate the inner class from a non-static method, the reference should be set to this. However, there is no this reference within a static method.

To fix the problem either:

  • Instantiate the inner class from a non-static method
  • Make the inner class static. Then you can instantiate it from anywhere (but it will no longer have a reference to an instance of the outer class).
like image 112
Dónal Avatar answered Oct 06 '22 00:10

Dónal


Of course the constructor need a instance of the outer class. That's why inner class exist: to live only within an outer class. You cannot instanciate an inner class outside of its outer class.

like image 23
gizmo Avatar answered Oct 06 '22 02:10

gizmo