我需要打开 N 个多播套接字(其中 N 来自参数列表的大小)。然后,我将在循环内将相同的数据发送到 N 个套接字中的每一个,最后关闭每个套接字。我的问题是,如何使用 try-with-resources block 来做到这一点?以下是我如何使用单个资源执行此操作:
final int port = ...;
try (final MulticastSocket socket = new MulticastSocket(port)) {
// Do a bunch of sends of small packet data over a long period of time
...
}
我能想到的使用多个端口执行此操作的唯一方法如下:
final List<Integer> ports = ...;
final List<MulticastSocket> sockets = new ArrayList<>(ports.size());
try {
for (final Integer port : ports) {
sockets.add(new MulticastSocket(port));
}
// Do a bunch of sends of small packet data over a long period of time
...
} finally {
for (final MulticastSocket socket : sockets) {
try {
socket.close();
} catch (final Throwable t) {
// Eat the exception
}
}
}
是否有更简洁的方法来完成此任务,或者我提出的解决方案是否足够好?
最佳答案
递归地执行以保持 try-with-resources 的保证:
void foo(List<Integer> ports, List<Socket> sockets) {
if (sockets.size() == ports.size()) {
// Do something with your sockets.
} else {
try (Socket s = new MulticastSocket(ports.get(sockets.size())) {
sockets.add(s);
foo(ports, sockets);
// You could call sockets.remove(sockets.size()-1) here.
// Not convinced whether it's worth it.
}
}
}
关于Java Try-With-Resources 未知资源计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44575340/