gpt4 book ai didi

java - 如何强制 AutoClosable 警告传播到 Java 类的调用者?

转载 作者:行者123 更新时间:2023-12-01 06:03:46 25 4
gpt4 key购买 nike

我是 Java 的 AutoClosable 接口(interface)的新手(但对 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;
}

当我这样做时,我收到警告/错误:资源泄漏:'webDriverLauncher'从未关闭

由于我无法关闭此方法中的资源,因为资源(即 WebDriver)正在调用方方法中使用,因此我想强制 launchDriver() 的调用方> 关闭驱动程序

因此,我决定让该方法返回 WebDriverLauncher 的实例 - 如以下示例所示:

public WebDriverLauncher launchDriver()
{
WebDriverLauncher webDriverLauncher = new WebDriverLauncher();
return webDriverLauncher;
}

这样,调用者将可以访问driver(通过调用webDriverLauncher .getDriver())并被警告关闭资源(我是这么想的)。

但是,当我尝试这样做时,警告消息完全消失了。换句话说,我不再看到关闭资源的警告 - 无论是在 launchDriver() 类/方法中还是在调用者/客户端类中(正如我所提到的,我希望警告出现,所以无论谁调用此方法会警告关闭资源)

我想了解的是:

1) 为什么警告没有传播到调用者类(如果资源从未关闭过)?

2) 为什么当我返回 webDriverLauncher 时警告消失,但当我返回 driver 时警告却消失?

3) 有没有办法修改代码以强制警告向调用者传播? (从而警告该方法的调用者关闭资源)

4) 如果无法做到这一点,可以采取什么措施来强制客户端关闭 WebDriver

谢谢!

最佳答案

这个问题我迟到了。但我的看法是:如果我们想强制客户端谨慎使用资源,我们可以限制资源创建(私有(private)构造函数加上通过为 启用属性 -Djava.security.manager 来禁用反射访问jar)并允许客户端仅向资源工厂提供对该资源调用的方法。

public class MyResource implements AutoCloseable {
public static class ResourceFactory {
public static void useResourceSafely(Consumer<MyResource> work) {
try(MyResource res = new MyResource()) {
work.accept(res);
}
catch(Exception e) {
e.printStackTrace();
//you may even check for Suppressed exceptions
}
}
}

private MyResource() {
System.out.println("Resource created");
}
public void doWork() {
System.out.println("resource in use");
}
@Override
public void close() throws Exception {
System.out.println("Closing myResource");

}
}

客户端代码可能如下所示:

public static void main(String[] args) throws Exception {
ResourceFactory.useResourceSafely(s -> {
s.doWork();
System.out.println("Check 1");
s.doWork();
System.out.println("Check 2");
});
}

这可能不是推荐的方式,但只是尝试这样做。

关于java - 如何强制 AutoClosable 警告传播到 Java 类的调用者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50283908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com