java – 将方法参数的所有权传递给’try with resources’块

我有一个关于
Java的’尝试资源’功能的问题.大多数示例似乎遵循在try语句中声明和实例化资源的模型,如下所示:

try (BufferedReader in =
        new BufferedReader(new InputStreamReader(socket.getInputStream())); ) {
  ...
}

我需要将一个可关闭的资源传递给一个方法,我想知道将一个作为方法参数传递给close块的可关闭资源的所有权传递给try块是否可行或可取.例如:

void handleConnection(Socket clientSocket) {
    try (Socket socket = clientSocket;
         BufferedReader in =
             new BufferedReader(new InputStreamReader(socket.getInputStream())); ) {
        ...
    }

这会正确清理clientSocket实例吗?我希望避免在我的代码中显式关闭clientSocket实例.

最佳答案 虽然这在技术上是正确的,但它很危险.许多AutoCloseable(包括Socket)在关闭后无法重新打开.因此,handleConnection方法的用户必须知道传递给您的方法的对象不能再使用.让对象的所有者处理它的生命周期可能是个更好的主意.例如,您可以通过创建一个包装类来实现这一点,该类本身实现了AutoCloseable,如下所示.

public class SocketHandler implements AutoCloseable {
    private final Socket clientSocket;

    public SocketHandler(Socket clientSocket) {
        if (clientSocket == null) {
            throw new IllegalArgumentException("Socket cannot be null");
        }
        this.clientSocket = clientSocket;
    }

    public void handle() {

    }

    @Override
    public void close() throws Exception {
        clientSocket.close();
    }

}
点赞