有什么办法可以在从类扩展时自动触发类构造函数吗?
我有一个TestSet.java类
public class TestSet {
public TestSet(String name) {
Logger.msg("Test set: " + name);
}
}
我希望构造函数每次从这个类扩展时都会触发。
似乎我需要“手动”调用构造函数:
public class TC1SendAnEmail extends TestSet{
//I have to type this every single time again and again...
//---------------------------------------------------------
public TC1SendAnEmail(String name) {
super(name);
}
//---------------------------------------------------------
public void run() {
new EmailLogin().run();
...
}
}
我想避免。 (因为我将创建数百/数千个扩展类。)
从我设法研究,我想这个功能没有在Java中实现。但似乎很奇怪,我必须一次又一次地“复制 - 粘贴”构造函数......
也许还有另一种我没看到的解决方案? (也许甚至没有使用构造函数“每次创建扩展我的TestSet类的类的实例时都会执行某些操作”。)
编辑: 是的,我可以理解为什么你认为创建数百/数千个子类是错误的。我正在创建一个大型自动化项目。这种类型的每个类都将是一个“测试”。并且会有成千上万的测试...
编辑#2: 这个问题的关键是我每次从它扩展时都需要触发超类构造函数。我的错误是将参数添加到超类构造函数中。 如果您没有向构造函数添加参数,那么它会在扩展时自动触发。
答案 0 :(得分:4)
从您的评论中我了解您正在努力实现的目标。 (自动打印当前运行测试的名称)
那么下面的代码片段呢?
public class TestSet {
public TestSet(){
Logger.msg("Test set: " + getClass().getSimpleName());
}
}
这个基类只是在创建时打印实现类的名称。例如。使用以下课程时:
public class TC1SendAnEmail extends TestSet {
// your methods
}
打印:
测试集:TC1SendAnEmail
这很有效,因为在java中,超类的默认构造函数(没有参数的构造函数)不必被覆盖,因为编译器会自动生成它。
答案 1 :(得分:2)
是
否则,它将如何知道您要将name
传递给它而不是其他参数?
答案 2 :(得分:1)
您可以做的是将此复制粘贴代码替换为某种Template method pattern:
public class SO50215241 {
public abstract static class TestSet {
public TestSet() {
System.out.println("Test set: " + getName());
}
abstract String getName();
}
public static class TC1SendAnEmail extends TestSet{
@Override
String getName() {
return "TC1Name";
}
}
public static void main(String[] args) {
new TC1SendAnEmail();
}
}
打印:
Test set: TC1Name
然后,您可以尝试为具体实现扩展某些特定版本的TestSet
,而不是扩展TestSet
本身。
或者在getName
方法体内动态计算名称。