【发布时间】:2015-07-19 18:38:42
【问题描述】:
每当类中没有显式构造函数时,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
如果没有声明构造函数,则可以创建对象 [...]
据我了解,位置构造函数是已声明且类似于 Java 的构造函数,如果没有明确的位置构造函数,您可以使用命名构造函数。我有一个想法,上面的默认构造函数调用(在testDynamic() 中)实际上正在工作,因为它使用空映射调用命名构造函数,但我很快就排除了这一点,因为命名构造函数部分以“如果没有声明构造函数”开头",我显然有一个。
【问题讨论】:
标签: groovy constructor instantiation default-constructor