在Java中传递静态方法
我试图创建一个类,该类的运行时间是方法的平均运行时间的倍。我知道如何做到这一点,运行了100次,并将其全部取平均值。例如:
private long calculateAvg(){
long totalTime = 0;
for(int i = 0; i < ITERATIONS; i++){
long startTime = System.nanoTime();
testMethod();
long endTime = System.nanoTime();
totalTime += (endTime - startTime); //divide by 1000000 to get milliseconds.
}
return (totalTime / ITERATIONS);
}
现在我可以将它设置为一个静态方法,但是有没有一种方法可以将不同的静态方法传递到这个计算中,而不是为我要测试的每个方法创建一个静态方法?如果没有,是否有一种设计模式可以在这里工作?到目前为止,我正在为每一个我想要计时的方法创建一个这样的方法,但它似乎并不高效,因为我重用了太多的代码
# 1 楼答案
您可以接受并运行
Runnable
参数:这样称呼它:
您可能还想从How do I write a correct micro-benchmark in Java?
中考虑一些技巧。# 2 楼答案
不,您不能在Java中传递方法,因为方法不是Java中的第一类公民,它们不是
values
。解决这类问题的模式是使用anonymous class
。以您的案例为例,您可以定义一个interface
:和另一个
MeasureUtil
util类,其中的方法接受类型Measurable
:然后每次
new
一个Measurable
的实例并将其传递给MeasureUtil.calculateAvg
:从jdk1开始。8 Java开始支持
lambda expression
,这使得使用sugar语法变得更加简单和容易:# 3 楼答案
根据您的输入,您的方法应该是这样的
然后,您应该有一个带有单个方法的接口:
在main方法中,有3种方法可以通过该方法。假设您想在SelectionSort类中测试静态排序方法
第一:匿名类(传统方式)
第二名:Lambda(Java 8)
第三:方法引用Java 8 Method Reference: How to Use it
# 4 楼答案
对于这个问题,我有两种解决方案:
1.Java反射:
您可以了解
proxy pattern
,您不需要自己调用真正的方法,代理可以。您可以获得调用real方法前后的时间proxy pattern tutorials# 5 楼答案
您不能“传递方法”,静态或非静态。相反,您需要创建从包含该方法的类创建的对象引用。然后调用对象引用上的方法。为了提供方法的不同实现,您需要创建一个
interface
。然后可以有许多类来实现该接口及其声明的方法。现在,计时代码使用该接口访问正确的方法现在修改计时方法以接受
TheMethod
实例:最后,您可以使用实现
TheMethod
的类的不同实例调用此方法: