我try 在try块中使用一个类成员作为资源(因为该资源需要在try块之后调用Close()):

class Manager {
    MyResource m_myResource;
    ...

    void doTraining() {
        m_myResource = createMyResource();
        try(m_myResource) {
            ...
        }
    }
    
}

但会有人抱怨说,m_myResource分不是最终有效的.为什么?我觉得m_myResource在初始化后是不变的.无论如何,我不确定如何解决这个问题.我能想到的一种方法是:

class Manager {
    MyResource m_myResource;
    ...

    void doTraining() {
        MyResource newResource = createMyResource();
        m_myResource = newResource;
        try(m_myResource) {
            ...
        }
    }
}

但我不确定将本地资源分配给班级成员是否会产生问题?

推荐答案

应避免维护用于存储有限生命周期的对象的字段.但如果您真的需要它,代码应该如下所示

class Manager {
    MyResource m_myResource;
    ...

    void doTraining() {
        try(MyResource newResource = createMyResource()) {
            m_myResource = newResource;
            ...
        }
        finally {
            m_myResource = null;
        }
    }
}

因此,当doTraining()try()块内没有正在进行的操作时,字段始终为null.

很明显,doTraining的这个实现不是可重入的;不能通过多个线程或递归调用重叠调用此方法.

如上所述,不建议这样做.但有时,通过操作中使用的所有API层传递资源是不切实际的.这种情况的存在已经被认识到了,并有一个计划中的通用解决方案,ExtentLocal.

有了这个,future 的版本将看起来像

class Manager {
    final static ExtentLocal<MyResource> MY_RESSOURCE = new ExtentLocal<>();
    ...

    void doTraining() {        
        try(MyResource newResource = createMyResource()) {
            ExtentLocal.where(MY_RESSOURCE, newResource )
                .run(() -> {/* code indirectly invoking foo */});
            ...
        }
    }
    void foo() {
        var resource = MY_RESSOURCE.get();
        // use resource
    }
}

请注意,这不会改变传递本地有效资源的实例.所以在这里,doTraining()是可重入的.

但是,这是在future 的某个地方,…

Java相关问答推荐

那么比较似乎不是词典学的,尽管doctor 这么说

最小拓Flutter 排序的时间复杂度是多少?

使用标记时,场景大纲不在多个线程上运行

Java LocalTime.parse在本地PC上的Spring Boot中工作,但在Docker容器中不工作

什么是Java原子属性的正确getter和setter

测试何时使用Mockito强制转换对象会导致ClassCastException

用户填充的数组列表永不结束循环

未找到适用于响应类型[类java.io.InputStream]和内容类型[Text/CSV]的HttpMessageConverter

为什么有两种实现来检索数组类的组件类型?

如何在Spring Boot中创建可以将值传递给配置的&Enable&Quot;注释?

在settings.gradle.kts和Build.gradle.kts中使用公共变量

Android Studio模拟器没有互联网

在Java泛型中使用通配符时,如何推断类型

如何在SWT菜单项文本中保留@字符

判断重复的两个二维表算法?

如何调整JButton的大小以适应图标?

从字节数组切换到JakartaMail org.springframework.mail.javamail.JavaMailSender InputStreamResource

Java编译器是否进行了持续的折叠优化,以及如何进行判断?

Cucumber中第二个网页的类对象未初始化

在JSON上获取反斜杠