Java 为什么';t@TupleConstructor生成构造函数

Java 为什么';t@TupleConstructor生成构造函数,java,groovy,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) {

给我:

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)
您将看到
@TupleConstructor
生成了以下构造函数:

TestObject.constructors.each {println it}
这里有两个问题

  • 生成的构造函数的字段顺序错误,因此构造函数调用不匹配。出现这种限制是因为反射API不能保证它将按照定义的顺序返回Java类的字段。
    Class.getFields()
    的javadoc说明:
  • 返回一个数组,该数组包含反映所表示的类或接口的所有可访问公共字段的
    Field
    对象 通过这个
    对象数组中的元素 返回的数据未排序,且未按任何特定顺序排列

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

    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)
    
    如果您这样做:

    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)
    
    您将看到
    @TupleConstructor
    生成了以下构造函数:

    TestObject.constructors.each {println it}
    
    这里有两个问题

  • 生成的构造函数的字段顺序错误,因此构造函数调用不匹配。出现这种限制是因为反射API不能保证它将按照定义的顺序返回Java类的字段。
    Class.getFields()
    的javadoc说明:
  • 返回一个数组,该数组包含反映所表示的类或接口的所有可访问公共字段的
    Field
    对象 通过这个
    对象数组中的元素 返回的数据未排序,且未按任何特定顺序排列

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

    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)