为什么@TupleConstructor不生成构造函数

时间:2014-05-28 14:18:06

标签: java groovy

class Test {
    @TupleConstructor(includeFields=true)
    static class TestObject {
        private int a = 1;
        protected int b = 2;
        public int c = 3;
        int d = 4;
        String s = "s";
    }

    static main(args) {
        print new TestObject(1, 2, 3, 4, '3')
    }

}

给我:

Caught: groovy.lang.GroovyRuntimeException: Could not find matching constructor for: in.ksharma.Test$TestObject(java.lang.Integer, java.lang.Integer, java.lang.Integer, java.lang.Integer, java.lang.String)
groovy.lang.GroovyRuntimeException: Could not find matching constructor for: in.ksharma.Test$TestObject(java.lang.Integer, java.lang.Integer, java.lang.Integer, java.lang.Integer, java.lang.String)
    at in.ksharma.Test.main(Test.groovy:17)

为什么不生成构造函数?

1 个答案:

答案 0 :(得分:3)

如果你这样做:

TestObject.constructors.each {println it}

您将看到@TupleConstructor已生成以下构造函数:

public in.ksharma.Test$TestObject(in.ksharma.Test,int,java.lang.String,int,int,int)
public in.ksharma.Test$TestObject(in.ksharma.Test,int,java.lang.String,int,int)
public in.ksharma.Test$TestObject(in.ksharma.Test,int,java.lang.String,int)
public in.ksharma.Test$TestObject(in.ksharma.Test,int,java.lang.String)
public in.ksharma.Test$TestObject(in.ksharma.Test,int)
public in.ksharma.Test$TestObject(in.ksharma.Test)

这里有两个问题。

  1. 生成的构造函数具有错误的字段顺序,因此构造函数调用不匹配。出现这种限制是因为反射API不保证它将按照定义的顺序返回Java类的字段。 Class.getFields()的javadoc说明了这一点:
  2.   

    返回一个包含Field个对象的数组,这些对象反映了所表示的类或接口的所有可访问公共字段   通过这个Class对象。 数组中的元素   返回的内容未按任何特定顺序排序

    1. 内部类不是静态的。因此,构造函数中的第一个参数应该是封闭类的实例。
    2. 要修复它,请使嵌套类保持静态并使用命名参数表示法:

      print new TestObject(a:3, b:3, c:4, d:5, s:'3')