[英]Calling Java method with void arguments
我正在嘗試實現秒表類,該類將包裝我正在嘗試測量的所有必需方法
主要目的是創建一個框架,無論何時要測量方法的執行時間,都可以從以下位置更改現有代碼:
<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是變色類型。
任何想法?
您可以嘗試用Void
代替void
(大寫V),因為從嚴格意義上講,第二個不是Void
type
。 另一方面是Void
的。 但是通常,如果您想使用“ void”進行調用,則只需忽略參數(在此處討論反射)
編輯:對您的評論
public void invoke(UUID machineId, Void a) { //note the capital V
invoke(machineId);
}
會編譯的很好,但是我看不到這種方法簽名的任何可用用例。
看來您想將方法傳遞給invoke()
方法。 由於您傳遞的方法不返回任何內容且沒有參數,因此應使用Runnable
接口:
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();
}
});
您到底想做什么? 沒有類型為void
對象或值,因此如果允許,則將無法調用該方法。
也許您想要的是能夠傳遞任何類型的對象。 在這種情況下,您可以使用Object
:
public void invoke(UUID machineId, Object a) {
invoke(machineId);
}
由於每個類都是Object
的子類,現在您可以將任何對象作為第二個參數傳遞給此方法,包括數組。 您還可以傳遞基本類型(它們將被包裝到其對應的包裝器類中)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.