开发者

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 ContentEntr开发者_JAVA技巧y 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..


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).


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.


In Java happens the same, but when you instantiate an inner instance you don't have to include the hidden parameter.

Try one of two things:

  1. declaring the inner class static (I hope you can do that in Groovy too)
  2. passing this in the creation of the ContentEntry instance... :)
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜