दुर्भाग्य से, जब आपने यह सवाल पूछा तो मेरी कल्पना जंगली हो गई। मुझे नहीं पता कि क्या यह समाधान अधिक सुरुचिपूर्ण माना जाता है। हालाँकि, ये कक्षाएं सरल और आसानी से पुन:उपयोग योग्य हैं, इसलिए यदि वे संतोषजनक नहीं हैं तो आप उनके लिए उपयोग कर सकते हैं। आप अंत में सब कुछ एक साथ आते हुए देखेंगे...
public class BinaryCloseable implements Closeable {
private Closeable first;
private Closeable last;
public BinaryCloseable(Closeable first, Closeable last) {
this.first = first;
this.last = last;
}
@Override
public void close() throws IOException {
try {
first.close();
} finally {
last.close();
}
}
}
BinaryCloseable
CompositeCloseable
. द्वारा उपयोग किया जाता है :
public class CompositeCloseable implements Closeable {
private Closeable target;
public CompositeCloseable(Closeable... closeables) {
target = new Closeable() { public void close(){} };
for (Closeable closeable : closeables) {
target = new BinaryCloseable(target, closeable);
}
}
@Override
public void close() throws IOException {
target.close();
}
}
ResultSetCloser
ResultSet
को बंद कर देता है ऑब्जेक्ट:
public class ResultSetCloser implements Closeable {
private ResultSet resultSet;
public ResultSetCloser(ResultSet resultSet) {
this.resultSet = resultSet;
}
@Override
public void close() throws IOException {
try {
resultSet.close();
} catch (SQLException e) {
throw new IOException("Exception encountered while closing result set", e);
}
}
}
PreparedStatementCloser
PreparedStatement
को बंद कर देता है ऑब्जेक्ट:
public class PreparedStatementCloser implements Closeable {
private PreparedStatement preparedStatement;
public PreparedStatementCloser(PreparedStatement preparedStatement) {
this.preparedStatement = preparedStatement;
}
@Override
public void close() throws IOException {
try {
preparedStatement.close();
} catch (SQLException e) {
throw new IOException("Exception encountered while closing prepared statement", e);
}
}
}
ConnectionCloser
Connection
को बंद कर देता है ऑब्जेक्ट:
public class ConnectionCloser implements Closeable {
private Connection connection;
public ConnectionCloser(Connection connection) {
this.connection = connection;
}
@Override
public void close() throws IOException {
try {
connection.close();
} catch (SQLException e) {
throw new IOException("Exception encountered while closing connection", e);
}
}
}
अब हम आपके मूल InputStream
. को रिफलेक्टर करते हैं में विचार:
public class ClosingInputStream extends InputStream {
private InputStream stream;
private Closeable closer;
public ClosingInputStream(InputStream stream, Closeable closer) {
this.stream = stream;
this.closer = closer;
}
// The other InputStream methods...
@Override
public void close() throws IOException {
closer.close();
}
}
अंत में, यह सब एक साथ आता है:
new ClosingInputStream(
stream,
new CompositeCloseable(
stream,
new ResultSetCloser(resultSet),
new PreparedStatementCloser(statement),
new ConnectionCloser(connection)
)
);
जब यह ClosingInputStream
का close()
विधि कहा जाता है, यह प्रभावी रूप से होता है (स्पष्टता के लिए छोड़े गए अपवाद हैंडलिंग के साथ):
public void close() {
try {
try {
try {
try {
// This is empty due to the first line in `CompositeCloseable`'s constructor
} finally {
stream.close();
}
} finally {
resultSet.close();
}
} finally {
preparedStatement.close();
}
} finally {
connection.close();
}
}
अब आप अधिक से अधिक Closeable
. को बंद करने के लिए स्वतंत्र हैं वस्तुओं को आप पसंद करते हैं।