我正在尝试编写一个方法,该方法接受Runnable类的构造函数并根据输入的构造函数以某种方式运行它。
所以我希望能够做到这样的事情:
public class MPClient {
static final int TIME_OUT = 5000;
Client client;
MultiPlayMatch match;
public MPClient(String name, int team, MultiPlayMatch match) {
this.match = match;
client = new Client();
client.start();
Network.registerPackets(client);
addListeners();
try {
client.connect(15000, Network.WIFI_IP, Network.PORT);
} catch (IOException e) {
e.printStackTrace();
client.stop();
}
while(true) {
}
}
private void addListeners() {
client.addListener(new Listener.ThreadedListener(new Listener() {
@Override
public void connected(Connection connection) {
}
@Override
public void disconnected(Connection connection) {
}
@Override
public void received(Connection connection, Object object) {
}
}));
}
}
我的问题是如何定义executeInParallel(someRunnable::new)
executeInParallel(someOtherRunnable::new)
方法以便能够传递我在参数中定义的任何Runnable构造函数?基本上我的问题是为了做到这一点我该如何定义这个方法?
executeInParallel
似乎我只能将遵循功能接口的方法作为参数,因此我无法使用接受多个void executeInParallel(??){ ... }
构造函数的单个参数来定义executeInParallel
是否存在我可以在不使用某种工厂模式的情况下完成这项工作吗?
我想说明我想要这样做的原因是我想传入构造函数而不是实例。我不能在executeInParallel之外生成实例,它必须在该方法内生成。我还想传递不同的构造函数,这些构造函数带有不同的参数
提前谢谢
修改 对不起,我希望这个问题更加清晰。
答案 0 :(得分:5)
您的executeInParallel()
方法接受会生成Runnable的内容,因此其签名应为executeInParallel(Supplier<? extends Runnable> runnableFactory)
然后,您可以使用任何lambda或方法引用来调用它,该引用可以返回实现Runnable
的任何类的实例。
可能的用法:
// Ex 1 :
class MyJob implements Runnable {
public void run() {...}
}
executeInParallel(() -> new MyJob());
executeInParallel(MyJob::new);
// Ex 2 :
class MyJobWithParams implements Runnable {
public MyJobWithParams(String param1, int param2) { ... }
public void run() {...}
}
executeInParallel( () -> new MyJobWithParams("Hello",42) );
// You cannot use method references here
// Ex 3 :
class RunnableFactory {
public static Runnable makeRunnable() {
return new MyJob(); // which is a Runnable, see above
}
}
executeInParallel( () -> RunnableFactory.makeRunnable() );
executeInParallel( RunnableFactory::makeRunnable );
此外,您声明只希望将Runnable构造函数传递给该方法。这可以通过方法引用(但仅适用于无参数构造函数)或通过lambda表达式(如上面的示例#1和#2)完成。