Мне задали в интервью следующий вопрос. Код, данный мне:
interface Connection {
void execute();
void close();
}
interface ConnectionPool {
Connection getConnection();
}
class Client {
ConnectionPool connectionPool = new MyConnectionPool() ;
Connection connection = connectionPool.getConnection();
public void execute() {
try{
connection.execute();
}finally {
connection.close();
}
}
}
class MyConnectionPool implements ConnectionPool {
MyConnectionPool(List<Connection> connections) {
}
@Override
public Connection getConnection() {
return null;
}
}
Здесь реализация Соединения выполняется кем-то другим, я могу только изменить класс пула MyConnection или создать новые классы. Проблема заключается в том, что всякий раз, когда клиент вызывает connection.close, объект соединения фактически закрыт, вместо этого необходимо добавить его обратно в пул соединений, который может использовать кто-то другой.
Моя реализация похожа на
class MyConnectionPool implements ConnectionPool {
Queue<Connection> connections;
MyConnectionPool(List<Connection> connections) {
this.connections = new LinkedList(connections);
}
@Override
public Connection getConnection() {
MyConnection connection = new MyConnection(connections.poll(), this);
return connection;
}
public void closeConnection(Connection connection) {
connections.add(connection);
}
}
class MyConnection implements Connection {
Connection connection;
boolean isClosed = false;
MyConnectionPool connectionPool;
MyConnection(Connection connection, MyConnectionPool connectionPool) {
this.connection = connection;
}
@Override
public void execute() {
if (!isClosed){
connection.execute();
}
}
@Override
public void close() {
if (!isClosed) {
connectionPool.closeConnection(this);
}
}
}
Это правильно? Есть ли лучший способ добиться того же.