簡體   English   中英

將方法參數的所有權傳遞給“嘗試使用資源”塊

[英]Pass ownership of method argument to 'try with resources' block

我有一個關於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();
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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