我试图实施一个秒表类,它将包含我试图测量的所有必需方法
主要目的是创建一个框架,当您想要测量方法的执行时间时,您将更改以下的退出代码:
<Classname> x = A();
或
A();
要:
<Classname> x = PSW.startWatch(MethodToWatch.B).invoke("123123123", A());
或
PSW.startWatch(MethodToWatch.B).invoke("123123123", A());
这是代码:
public class PerformanceStopWatch {
private long start;
private long end;
private String uniqueID;
private MethodToWatch methodName;
public enum MethodToWatch {
A,
B
}
public PerformanceStopWatch startWatch(MethodToWatch methodName) {
this.methodName = methodName;
start();
return this;
}
public void invoke(String uniqeID) {
this.uniqueID = uniqeID;
stop();
}
public void invoke(UUID machineId, void a) {
invoke(machineId);
}
private void start() {
start = System.nanoTime();
}
private void stop() {
end = System.nanoTime();
System.out.println("[PerformanceStopWatch|"+methodName.name()+"] - Unique ID: "+ uniqueID + " Took: <"+(end-start)+"> Nanosec");
}
}
public void a() {
PerformanceStopWatch PSW = new PerformanceStopWatch();
..
..
..
PSW.startWatch(MethodToWatch.B).invoke("123123123", b());
}
public void b() {
...
...
..
}
问题是编译器不允许我使用
public void invoke(UUID machineId, void a) {
}
void是非法类型。
任何想法?
答案 0 :(得分:4)
您可以尝试Void
void
(资本V),因为第二个不是严格意义上的type
。另一方面,Void
是。
但一般来说,如果你想用“void”调用,你只需省略参数(在这里讨论反思)
编辑:发表评论
public void invoke(UUID machineId, Void a) { //note the capital V
invoke(machineId);
}
编译得很好,但是我没有看到这种方法签名的任何可用用例。
答案 1 :(得分:3)
看起来您想要将方法传递给invoke()
方法。由于您传递的方法没有返回任何参数,因此您应该使用Runnable
interface:
public void invoke(UUID machineId, Runnable a) {
invoke(machineId);
a.run();
}
和
PSW.startWatch(MethodToWatch.B).invoke("123123123", () -> {b();});
或(如果您不使用Java 8):
PSW.startWatch(MethodToWatch.B).invoke("123123123",
new Runnable() {
public void run() {
b();
}
});
答案 2 :(得分:1)
你到底想做什么?没有类型var value = await AsyncStorage.getItem('STORAGE_KEY');
的对象或值,因此如果允许,您将无法调用该方法。
也许你想要的是能够传递任何类型的对象。在这种情况下,您可以使用void
:
Object
由于每个类都是public void invoke(UUID machineId, Object a) {
invoke(machineId);
}
的子类,现在您可以将任何对象作为第二个参数传递给此方法,包括数组。您还可以传递基本类型(它们将被包装到相应的包装类中)。