Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使所有主要方法显示执行时间_Java_Inheritance_Main_Abstract - Fatal编程技术网

Java 如何使所有主要方法显示执行时间

Java 如何使所有主要方法显示执行时间,java,inheritance,main,abstract,Java,Inheritance,Main,Abstract,我已经有一段时间没有用Java编程了,我似乎无法解决它,所以我为我可能做的任何愚蠢的事情提前道歉 我目前正在用Java解决一系列数学问题。我为每个问题创建了一个名为ProblemX的新类。我希望每个类打印执行的持续时间。 与其在每个单独的类中编程,我想我应该使用一些继承,但这正是我陷入困境的地方 Public abstract class Problem{ public static void main(String[]args){ Problem p = new Problem();

我已经有一段时间没有用Java编程了,我似乎无法解决它,所以我为我可能做的任何愚蠢的事情提前道歉

我目前正在用Java解决一系列数学问题。我为每个问题创建了一个名为ProblemX的新类。我希望每个类打印执行的持续时间。 与其在每个单独的类中编程,我想我应该使用一些继承,但这正是我陷入困境的地方

Public abstract class Problem{

 public static void main(String[]args){
   Problem p = new Problem();
   long startTime = System.nanoTime();
   p.solve();
   long endTime = System.nanoTime();
   System.out.println("Execution time: " + (endTime - startTime) + " nanoseconds");
 }

abstract void solve();

}
这不起作用,因为我无法在抽象类中创建问题的实例。 我不能使用可解决的接口,因为问题必须定义“解决”


很明显,我在这里遗漏了一些东西,因此如果有人能帮忙,我将不胜感激。

您可以这样做

public abstract class Problem{

    long startTime;

    long endTime;

    public void startTime(){
    startTime = System.nanoTime();
    }

    public void endTime(){
    endTime = System.nanoTime();
    }

    public long measure(){
    return endTime - startTime;
    }

}

public class ProblemX extends Problem{

    public static void main(String[] a){
     ProblemX x = new ProblemX(); 
     x.startTime();
     //do your work
     x.endTime();
     System.out.println("time taken" + x.measure());
    }
}

也许是这样的

package com.stackoverflow;
public abstract class Problem {
    public static void main(String[] args) {
        Problem p = new Problem(){

            @java.lang.Override
            protected void doCalculation() {
                for (int i = 0; i < 1000; i++) {
                    System.out.println("Printing number... " + i);
                }
            }
        };
        p.solve();
        System.out.println("Execution time: " + p.getElapsedTime() + " nanoseconds");
    }

    private long startTime, endTime;
    private void doStartTime() {
        startTime = getSystemNanoTime();
    }
    private void doEndTime() {
        endTime = getSystemNanoTime();
    }
    private long getSystemNanoTime() {
        return System.nanoTime();
    }
    protected abstract void doCalculation();

    public void solve() {
        doStartTime();
        doCalculation();
        doEndTime();
    }
    public long getElapsedTime() {
        return endTime - startTime;
    }

}
那么:

public abstract void solve();

public void solveProblem() {
    startTime();
    solve();
    endTime();
    System.out.println(timeTaken);
}

然后重写solve并调用solveProblem。

无法测量并返回所需的时间?您可以在命令行上使用
time java etc
来添加计时。@zapl是的,但如果我在超类中尝试这样做,它只会将我的问题转移到solve方法。除非我在每个子类中都这样做,否则会花费太多时间。@PeterLawrey我知道这确实是一个解决方案,但我只是在Eclipse中解决数学问题,我不做任何与命令行相关的事情,也不打算对我的代码做任何改动,我只对我的代码生成的数学答案感兴趣。是的,但鉴于我将要生成数百个这样的子问题类,我仍然必须在每个类中编写这些代码。我希望有一种方法可以实现Problem类,编写solve()方法,然后自动获得执行时间。但如果这不可能,我会使用你的解决方案。这看起来很像我需要的!现在唯一的问题是,我的ProblemX类无法再覆盖doCalculation方法,因为它将始终打印从1到1000的所有数字。通过运行XProblem代码而不是我的计数器所需的更改扩展了我的原始帖子。除非我有一个静态主方法或problem实例,否则我无法调用solveProblem。静态main方法不起作用,因为solveProblem和solve必须是静态的(并且不可能重写),并且我不能有问题的实例,因为它是抽象的。假设您正在编写一个类Problem1扩展问题。覆盖求解。在main方法中创建一个新的Problem1();然后调用solveProblem(),这正是我想要的!这并不像我想象的那么复杂。我想我得复习一下Java。谢谢你抽出时间。
Problem p = new XProblem();
public abstract void solve();

public void solveProblem() {
    startTime();
    solve();
    endTime();
    System.out.println(timeTaken);
}