gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:27:35 27 4
gpt4 key购买 nike

每当类中没有显式构造函数时,Java 编译器就会自动生成默认构造函数,我是从小就这样长大的;当我有任何显式构造函数时不生成。

据我所知,构造函数定义了必需的依赖项,属性定义了可选的依赖项(很可能具有默认值......由构造函数设置)。能够调用<init>() 未定义在面向对象的代码中是完全错误的,如果你遵守上述规则(这是我在我的职业生涯中根据经验得出的)。

这是我尝试过的一个简单测试,我注意到即使使用显式构造函数,也很容易在没有参数的情况下实例化对象。 我怎样才能让这个程序在编译时或运行时在标有???的行失败? ?

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}"; }
}

输出:

Name: static
compile error

Name: dynamic
Name: null

Name: reflection
Name: null

预期:RuntimeException而不是 Name: null .

我试图在 Groovy documentation 中找到相应的部分,但我没有找到任何真正相关的东西。我找的关键字是default constructor , no-arg constructor , no-args constructor , no-arguments constructor .

虽然这是一个远程相关的:

Named argument constructor
If no constructor is declared, it is possible to create objects [...]

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

最佳答案

在 Groovy 中,您可以调用不带参数的单参数方法。届时将使用 Null。 (除非参数具有原始类型,否则调用失败)。因此,Groovy 也为构造函数执行此操作是完全合法和定义的。计划在未来删除该功能。因此我们决定静态 groovy 编译器将永远不支持它。这就是静态编译器在这里编译失败的原因。因此,生成无参数构造函数的情况并非如此,采用空值调用构造函数的现有 String 兼容值。如果你绝对想阻止这种情况,你可以尝试元编程来替换构造函数并添加空检查。 Groovy 不会在这里为您抛出异常

关于groovy - 如何防止使用默认构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31494229/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com