Groovy 如何防止使用默认构造函数?

Groovy 如何防止使用默认构造函数?,groovy,constructor,instantiation,default-constructor,Groovy,Constructor,Instantiation,Default Constructor,在我成长的过程中,每当类中没有显式构造函数时,Java编译器就会自动生成一个默认构造函数;当我有任何显式构造函数时不生成 据我所知,构造函数定义了所需的依赖项,属性定义了可选的依赖项(很可能是由构造函数设置的默认值)。在面向对象代码中,如果你坚持上面的规则(这是我在职业生涯中经验之谈),那么在没有定义的情况下调用()是完全错误的 下面是一个简单的测试,我试过并注意到,即使使用显式构造函数,也很容易在没有参数的情况下实例化对象如何使该程序在编译时或运行时在标有??的行中失败 class TestG

在我成长的过程中,每当类中没有显式构造函数时,Java编译器就会自动生成一个默认构造函数;当我有任何显式构造函数时不生成

据我所知,构造函数定义了所需的依赖项,属性定义了可选的依赖项(很可能是由构造函数设置的默认值)。在面向对象代码中,如果你坚持上面的规则(这是我在职业生涯中经验之谈),那么在没有定义的情况下调用
()
是完全错误的

下面是一个简单的测试,我试过并注意到,即使使用显式构造函数,也很容易在没有参数的情况下实例化对象如何使该程序在编译时或运行时在标有
的行中失败

class TestGroovy {
    private final String name
    TestGroovy(String name) {
        this.name = name
    }

    static void main(String[] args) {
        testStatic()
        println()
        testDynamic()
        println()
        testReflection()
    }

    @groovy.transform.CompileStatic
    static void testStatic() {
        println new TestGroovy("static");
        println "compile error"
        // Groovyc: [Static type checking] - Cannot find matching method TestGroovy#<init>().
        // Please check if the declared type is right and if the method exists.
        //println new TestGroovy(); // correct
    }

    static void testDynamic() {
        println new TestGroovy("dynamic");
        println new TestGroovy(); // ???
    }

    static void testReflection() {
        println TestGroovy.class.newInstance([ "reflection" ] as Object[]);
        println TestGroovy.class.newInstance(); // ???
    }

    @Override String toString() { return "Name: ${name}"; }
}
应为
运行时异常
而不是
名称:null

我试图在中找到相应的部分,但没有找到任何真正相关的内容。我查找的关键字是
默认构造函数
无参数构造函数
无参数构造函数
无参数构造函数

虽然这里有一个远程相关的:


如果未声明构造函数,则可以创建对象[…]


据我所知,位置构造函数是声明的类Java构造函数,如果没有明确的位置构造函数,可以使用命名构造函数。我认为上面的默认构造函数调用(在
testDynamic()
中)实际上是有效的,因为它使用空映射调用命名构造函数,但我很快就排除了这一点,因为命名构造函数部分以“如果未声明构造函数”开头,我显然有一个。

在Groovy中,您可以不带参数地调用单参数方法。届时将在适当位置使用Null。(除非参数具有基元类型,否则调用将失败)。所以Groovy也可以为构造函数这样做,这是完全合法的。计划将来删除该功能。因此,我们决定静态groovy编译器永远不支持它。这就是静态编译器在这里编译失败的原因。因此,情况并非如此,即生成一个无参数构造函数,使用空值调用现有的字符串兼容值构造函数。如果您确实想防止这种情况发生,您可以尝试使用元编程来替换构造函数并添加空检查。Groovy不会在这里为您抛出异常

在Groovy中,您可以无参数调用单参数方法。届时将在适当位置使用Null。(除非参数具有基元类型,否则调用将失败)。所以Groovy也可以为构造函数这样做,这是完全合法的。计划将来删除该功能。因此,我们决定静态groovy编译器永远不支持它。这就是静态编译器在这里编译失败的原因。因此,情况并非如此,即生成一个无参数构造函数,使用空值调用现有的字符串兼容值构造函数。如果您确实想防止这种情况发生,您可以尝试使用元编程来替换构造函数并添加空检查。Groovy不会在这里为您抛出异常

,如果您知道的话,这实际上是有意义的。一个简单的
assert name
执行此任务并证明调用了单个arg构造函数。参数检查是我无论如何都应该做的事情:)这有文档记录吗?(注:我不认为文档是不相关的)。我想它会被记录在。我也认为,它已经在某个地方被提到了,但它不是。我认为它在旧的codehaus页面的一页上,但还不是新文档的一部分。但是是的,如果你知道的话,这将进入方法选择算法页面,这实际上是有意义的。一个简单的
assert name
执行此任务并证明调用了单个arg构造函数。参数检查是我无论如何都应该做的事情:)这有文档记录吗?(注:我不认为文档是不相关的)。我想它会被记录在。我也认为,它已经在某个地方被提到了,但它不是。我认为它在旧的codehaus页面的一页上,但还不是新文档的一部分。但是是的,这将进入方法选择算法页面
Name: static
compile error

Name: dynamic
Name: null

Name: reflection
Name: null