Java 重复调用使改造网络调用排队的静态方法是否会相应地保持所传递参数的值?

Java 重复调用使改造网络调用排队的静态方法是否会相应地保持所传递参数的值?,java,android,retrofit,retrofit2,Java,Android,Retrofit,Retrofit2,通过从for循环调用上面的静态方法,我使用改进将多个类型为Feedback的对象按顺序发送到服务器 当试图访问从回调函数内部反馈的传递参数时,IDE强迫我将传递的参数作为最终参数 假设: 现在假设每次网络呼叫都需要1秒钟,直到我收到响应。但是,由于我使用for循环来调用sendfeived静态方法,因此在改型回调方法收到第一个响应之前,它将被调用大约10次 问题:由于该方法在通过改造异步调用在其内部初始化的线程返回响应之前,将以任何一种方式过早结束。这是否意味着回调方法内部所做的工作将在for循

通过从for循环调用上面的静态方法,我使用改进将多个类型为Feedback的对象按顺序发送到服务器

当试图访问从回调函数内部反馈的传递参数时,IDE强迫我将传递的参数作为最终参数

假设:

现在假设每次网络呼叫都需要1秒钟,直到我收到响应。但是,由于我使用for循环来调用sendfeived静态方法,因此在改型回调方法收到第一个响应之前,它将被调用大约10次

问题:由于该方法在通过改造异步调用在其内部初始化的线程返回响应之前,将以任何一种方式过早结束。这是否意味着回调方法内部所做的工作将在for循环中最后传递的Feedback类型的参数上进行,还是在null上进行,因为该方法无论如何都会在该时间结束

但是,我确信,自从显示使用上下文的toast之后,至少有一个传递的参数仍然存在!请给我一个解释


为什么IDE强迫我将参数设置为final?

Java要求,如果要在匿名类中使用局部变量,它必须是final。基本上,只要代码看起来像

 public static void sendFeedback(final Feedback feedback, final Context context) {
    Call<MyServerResponse> sendFeedbackCall = service.sendFeedback(feedback);

    sendFeedbackCall.enqueue(new Callback<MyServerResponse>() {
        @Override
        public void onResponse(@NonNull Call<MyServerResponse> call, @NonNull Response<MyServerResponse> response) {
            if (response.isSuccessful()) {
                feedback.setSent(true); // *do more actions on **that feedback object** based on the response body.*
            } else {
             feedback.setSent(false); // *do more actions on **that feedback object** based on the response body.*
            }
        }

        @Override
        public void onFailure(@NonNull Call<MyServerResponse> call, @NonNull Throwable t) {
          feedback.setSent(false); // do more actions on **that feedback object** based on the response object.
          Toast.makeText(context,"Hello",Toast.LENGTH_SHORT).show(); // use the passed argument **context**
    });
}
在这种情况下,匿名类a和c中使用的任何局部变量都必须是final。这只是语言的一个要求。它不会改变你的代码的工作方式。它仍将按照您期望的方式运行。

首先:为了从方法内部创建的匿名类中访问任何变量,该变量必须是最终变量。自从Java8以来,不再需要显式地编写final关键字,但是变量不能在方法内部更改。所以,毕竟final是隐式应用于您的

第二:每次调用该方法时,该变量都会复制到匿名类中,以便被创建的匿名类使用。这就是为什么如果你启动一个线程,它仍然会有变量可以使用,即使方法的作用域在那时已经结束,方法参数也不再存在。请参阅以下代码:

void myMethod(A a, B b) {
    C c = new C();
    doSomething(new MyClass() {
        void methodInAnonymmousClass() {
             a.doSomething();
             c.doSomething();
        }
    });
}
上述代码将打印:12345678910


同样的概念也适用于这个问题,其中匿名类是一个改型回调。

并且似乎相应传递的变量被复制到内存中,以供匿名类以后使用,因为该方法将在那时结束,因为它在另一个线程上工作,就像我的情况一样,值总是正确的。但是这些变量也是通过引用复制的吗?我还在想,是的。在Java中,变量和对象是分开的。变量包含对对象的引用,因此当您复制变量时(例如,通过将方法参数复制到匿名类中),即使在方法结束且原始变量不再存在后,复制的变量仍会继续引用同一对象。
for(int i =0; i<10,i++){
    show(i);
 }
void show(final int param) {
    new Thread(new Runnable() {
        public void run() {
                try {
                    wait(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            System.out.print(param);
        }
    }).start();
}