Как заставить AutoClosable Предупреждение распространяться на вызывающего класса в Java? - PullRequest
0 голосов
/ 11 мая 2018

Я новичок в интерфейсе 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?

Спасибо!

1 Ответ

0 голосов
/ 11 мая 2018

Использование Оператор проб с ресурсами

 try (WebDriverLauncher webDriverLauncher = new WebDriverLauncher(){
     //Your Code Here
 }//webDriverLauncher.close() will be called after here weather throw any exception in try...catch block or not.

В других мирах интерфейс AutoClosable является ограничением для определения, какой тип может использоваться в Try-with-resources statement

...