使用void参数调用Java方法

时间:2015-12-01 09:12:00

标签: java

我试图实施一个秒表类,它将包含我试图测量的所有必需方法

主要目的是创建一个框架,当您想要测量方法的执行时间时,您将更改以下的退出代码:

<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是非法类型。

任何想法?

3 个答案:

答案 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); } 的子类,现在您可以将任何对象作为第二个参数传递给此方法,包括数组。您还可以传递基本类型(它们将被包装到相应的包装类中)。