使用 SWF TryCatch 中 doCatch() 方法中 doTry() 方法中定义的变量

Use a variable defined in doTry() method from doCatch() method in SWF TryCatch

我有一个 SWF TryCatch class 结构,如:

new TryCatch() {
        @Override
        protected void doTry() throws Throwable {
            Promise<Boolean> ifHostsWereReserved = client.reserveHostsForOnboarding());
            Promise<Boolean> ifHostsReleaseCompleted = client.releaseExtraHostsAfterOnboarding();
        }

        @Override
        protected void doCatch(Throwable e) throws Throwable {
            updateAvailableHosts(ifHostsWereReserved,
            ifHostsReleaseCompleted);
        }
}

我无法访问 doCatch() 块中的变量,因为这些变量是 doTry() 方法的本地变量。此外,如果我在 doTry() 方法之前声明它们并在 doTry() 方法中更新它们的值,它们不再等同于 final 并且我收到编译错误。

Whats 是处理此问题的首选方法。

您可以这样声明变量:

new TryCatch() {
        Promise<Boolean> ifHostsWereReserved;
        Promise<Boolean> ifHostsReleaseCompleted;

        @Override
        protected void doTry() throws Throwable {
            ifHostsWereReserved = client.reserveHostsForOnboarding());
            ifHostsReleaseCompleted = client.releaseExtraHostsAfterOnboarding();
        }

        @Override
        protected void doCatch(Throwable e) throws Throwable {
            updateAvailableHosts(ifHostsWereReserved,
            ifHostsReleaseCompleted);
        }
}

eazimmerman 的评论是正确的。如果需要引用TryCatch之外的变量,Settable可以这样使用:

final Settable<Boolean> ifHostsWereReserved = new Settable<>();
final Settable<Boolean> ifHostsReleaseCompleted = new Settable<>();

new TryCatch() {

    @Override
    protected void doTry() throws Throwable {
        ifHostsWereReserved.chain(client.reserveHostsForOnboarding()));
        ifHostsReleaseCompleted.chain(client.releaseExtraHostsAfterOnboarding());
    }

    @Override
    protected void doCatch(Throwable e) throws Throwable {
        updateAvailableHosts(ifHostsWereReserved,
        ifHostsReleaseCompleted);
    }
};

useTheseVariables(ifHostsWereReserved, ifHostsReleaseCompleted);