簡體   English   中英

用無效參數調用Java方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM