Я новичок в интерфейсе AutoClosable Java (но не новичок в Java). Я пытаюсь заставить клиентский код, который запрашивает экземпляр WebDriver
, закрыть driver
после того, как он завершит его использование (вызывая driver.quit()
)
Я хочу, чтобы любой метод, который создает экземпляр экземпляра WebDriver
, принудительно закрывал его.
Итак, я создал новый класс, который реализует AutoClosable
:
public class WebDriverLauncher implements AutoCloseable {
WebDriver driver;
public WebDriverLauncher()
{
driver = new FirefoxDriver();
}
public WebDriver getDriver()
{
return driver;
}
@Override
public void close() throws Exception {
driver.quit();
}
}
Теперь вместо непосредственного создания экземпляра WebDriver (WebDriver driver = new FirefoxDriver()
) я создаю экземпляр экземпляра этого класса и возвращаю ему экземпляр WebDriver
, как в следующем примере:
public WebDriver launchDriver()
{
WebDriverLauncher webDriverLauncher = new WebDriverLauncher();
WebDriver driver = webDriverLauncher.getDriver();
return driver;
}
Когда я делаю это, я получаю предупреждение / ошибку: Resource leak: 'webDriverLauncher' is never closed
Поскольку я не могу закрыть ресурс в этом методе, поскольку ресурс (т. Е. WebDriver
) используется в методе вызывающего, я хочу заставить вызывающего launchDriver()
закрыть driver
.
Поэтому вместо этого я решил, что метод должен возвращать экземпляр WebDriverLauncher
- как в следующем примере:
public WebDriverLauncher launchDriver()
{
WebDriverLauncher webDriverLauncher = new WebDriverLauncher();
return webDriverLauncher;
}
Таким образом, вызывающий абонент получит доступ к driver
(позвонив по номеру webDriverLauncher .getDriver()
) и получит предупреждение о закрытии ресурса (так я и думал).
Однако, когда я попробовал это, предупреждающее сообщение полностью исчезло. Другими словами, я больше не вижу предупреждение о закрытии ресурса - ни в классе / методе launchDriver()
, ни в классе вызывающего / клиентского (как я уже говорил, я хочу, чтобы предупреждение появлялось, поэтому всякий, кто вызывает этот метод, получает предупреждение о закрытии ресурс)
Я пытаюсь понять следующее:
1) Почему предупреждение не распространяется до класса вызывающего (если ресурс никогда не был закрыт)?
2) Почему предупреждение исчезает, когда я возвращаюсь webDriverLauncher
, а не когда я возвращаюсь driver
?
3) Есть ли способ изменить код, чтобы предупреждение распространялось на вызывающего абонента? (чтобы предупредить вызывающего этого метода о закрытии ресурса)
4) Если это невозможно, что можно сделать 1056 *, чтобы заставить клиента закрыть WebDriver
?
Спасибо!