[英]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.