当前位置: 首页 > 知识库问答 >
问题:

从内部类引用的JAVA局部变量必须是final或有效的final

高云瀚
2023-03-14

我正在尝试返回统计信息对象。

但我得到了

从内部类引用的局部变量必须是最终变量或实际上是最终变量

on < code > stats = statistics如何返回对象,但要确保< code >。close();是否正在运行?

 public static Statistics getStatistics(String environmentName) {
    Container container = getContainer(environmentName);
    Statistics stats = new Statistics();

    try {
        dockerClient().statsCmd(container.getId()).exec(new ResultCallback<Statistics>() {
            @Override
            public void onStart(Closeable closeable) {

            }

            @Override
            public void onNext(Statistics statistics) {
                stats = statistics;
            }

            @Override
            public void onError(Throwable throwable) {

            }

            @Override
            public void onComplete() {

            }

            @Override
            public void close() throws IOException {

            }
        }).close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return stats;
}

共有3个答案

范文昌
2023-03-14

您正在创建一个匿名的内部类:

new ResultCallback<Statistics>() { @Override public void onStart(Closeable closeable) { } @Override public void onNext(Statistics statistics) { stats = statistics; } @Override public void onError(Throwable throwable) { } @Override public void onComplete() { } @Override public void close() throws IOException { } }).close();

问题是你在方法中定义了统计数据,这是不必要的,因为你在匿名内部类中再次定义它,@Override公共 void onNext(Statistics statistics) { stats = statistics; }

相反,尝试直接在类中声明变量,并用null初始化。内部函数只能在匿名类中重新定义它。

姜嘉赐
2023-03-14

你可以尝试使用java.util.concurrent.CompletableFuture(java 8)。在这种情况下:

public static Statistics getStatistics(String environmentName) {
    Container container = null;
    CompletableFuture<Statistics> future = new CompletableFuture<>();

    try {
        dockerClient().statsCmd(container.getId()).exec(new ResultCallback<Statistics>() {
            @Override
            public void onStart(Closeable closeable) {

            }

            @Override
            public void onNext(Statistics statistics) {
                if (!future.isDone()) {
                    future.complete(statistics);
                }
            }

            @Override
            public void onError(Throwable throwable) {
                future.completeExceptionally(throwable);
            }

            @Override
            public void onComplete() {
                if (!future.isDone()) {
                    future.complete(null);
                }
            }

            @Override
            public void close() throws IOException {

            }
        }).close();
    } catch (IOException e) {
        e.printStackTrace();
    }

    try {
        // wait until statistics resolved
        return future.get();

    } catch (Exception e) {
        throw new RuntimeException(e.getMessage(), e);
    }
}

或者,如果exec代码是同步的,您可以使用AtomicReference,例如,作为一个临时容器。该方法将类似于上面的CompletableFuture示例,但开销更少

荆亦
2023-03-14

您想调用<code>getStatistics

但实际上,回调只能异步地通知用户统计信息最终到达。

因此,改变:

f(String env) {
    Statistics stats = getStatistics(env);
    g(stats);
}

f(String env) {
    retrievStatistics(env);
}

public static void retrieveStatistics(String environmentName) {
    Container container = getContainer(environmentName);
    stats = null;
    try {
        dockerClient().statsCmd(container.getId()).exec(new ResultCallback<Statistics>() {
            Statistics stats;

            @Override
            public void onNext(Statistics statistics) {
                g(statistics);
                stats = statistics; // Alternative when using onComplete instead.
            }

            @Override public void onStart(Closeable closeable) {}
            @Override public void onError(Throwable throwable) { }
            @Override public void onComplete() {
                g(stats); // Or this
            }
            @Override public void close() throws IOException { }
        }).close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

像您一样繁忙的等待循环是次优的。

 类似资料:
  • 我有一个JavaFX 8程序(用于JavaFXPorts交叉平台),几乎可以做我想做的事情,但又短了一步。该程序读取文本文件,对行进行计数以建立随机范围,从该范围中选取一个随机数,然后读取该行以进行显示。 我对java有点陌生,但似乎我是否使用Lambda在中显示下一个随机行,我的

  • 问题内容: 我有一个JavaFX 8程序(用于跨平台的JavaFXPorts),可以完成我想做的事情,但只差了一步。该程序读取一个文本文件,对行进行计数以建立一个随机范围,从该范围中选择一个随机数,然后读取该行以进行显示。 我对Java有点陌生,但是似乎我是否使用Lambda都不显示下一个随机行,我的行期望一个静态值。 有什么想法可以调整我必须在每次按下屏幕按钮时简单显示var readln2的下

  • 我甚至不确定这段代码是否能做任何事情,即使它有效,但我不知道该怎么做才能摆脱“从内部类引用的局部变量必须是最终的或有效的最终”错误消息,该错误消息显示在以“fireballRight[i]”开头的三行上。 任何指导将不胜感激,谷歌似乎并没有帮助我。

  • 问题内容: 我收到错误提示,就像在主题中一样,请问如何修复…错误在menuItem循环中,在这里我尝试将textArea前景颜色设置为从menuItem中选择的一种:(colors [mi]) 问题答案: 该错误意味着 您不能在内部类中使用局部变量。 要在内部类中使用变量,必须对其进行声明。只要是循环计数器并且不能分配变量,就必须创建一种变通方法来获取可在内部类内部访问的变量中的值: 因此,您的代

  • 今天我想做一些我想完成的项目,在那里我得到了一个异常,我不能从lambda表达式中引用局部变量。我有一个方法,其中我给出了两个值,该方法检查值对是否已经在HashMap中 当它结束时,我想读出布尔函数,需要知道他是否发现它成立= false我怎样才能在这个lambda中设置founded或者有没有其他方法可以做到这一点?

  • 这个程序是我的类的最终赋值,我在弄清楚为什么我收到错误“从内部类引用的局部变量必须是最终的或实际上是最终的”时遇到了问题。该程序正在运行并发线程来对#的数组进行排序,然后找到该数组的高值和低值。当我在没有并发的情况下创建它时,我没有这个错误。我正在努力确定在哪里最终确定高变量和低变量。 这是产生错误的代码块。如果我使int高=数字[0];或int-low=数字[0];final,然后我得到一个错误