假设我想用 Java 解决一堆 Project Euler 问题,而不是为每个问题类提供其自己的 main
方法的样板,而是继承它并拥有一个“解决”方法。
有没有办法让问题类的名称与解决方案一起打印出来?
我有什么:
abstract class Problem {
private static String problemName = ???
public static void main(String[] args) {
// If I could summon an instance of the sub-class then it would be easy
// Problem p = new ... what?
System.out.println(problemName + ": " + solve());
}
abstract static long solve();
// oops, you can't do abstract static in Java :(
}
然后
public class Euler_001 extends Problem {
static long solve() {...}
}
问题在于获取 this answer 中给出的类名的各种技巧。返回“Problem”,而不是“Euler_001”。
我想我必须实例化问题类,但是我该怎么做呢?
最佳答案
静态上下文无助于父级需要调用子级的继承。使用具有抽象的实例:
abstract class Problem {
public static void main(String[] args) throws Exception {
Problem problem;
//Now, depending on where the exact problem is specified:
//Class known at compile time
problem = new Euler_001();
//Class passed as parameter
problem = (Problem) Class.forName(args[0]).getConstructor().newInstance();
System.out.println(problem.getProblemName() + ": " + problem.solve());
}
abstract long solve();
abstract String getProblemName();
}
子类将提供一个重写抽象方法的普通实现:
class Euler_001 extends Problem {
@Override
long solve() {
return 0;
}
@Override
String getProblemName() {
return "????";
}
}
根据您的配置方法,您可以在父级的 main
方法内根据类名创建具体类的实例。
这样,就可以通过以下方式调用 Problem
类:
java com.mypackage.Problem "com.mypackage.Euler_001"
关于java - Java中继承的静态方法中获取类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52442830/