在Java SwingWorker方法的签名中使用final变量

时间:2011-09-07 10:24:04

标签: java scope final swingworker

I have a method that uses a SwingWorker.   Part of the code is shown below:

   public class mySocket {

   public void writePacket(final String packet) {
    // schedules execution on the single thread of the executor (so only one
    // background operation can happen at once)
    //
    executor.execute(new SwingWorker<String, Void>() {

        @Override
        protected String doInBackground() throws Exception {
            // called on a background thread
            System.out.println("writing out this packet->" + packet + " 
                            <-");
            out.println(packet);
            String thePacket = readPacket();
            return thePacket;
        }

                ..................

我的问题是关于writePacket方法的签名。变量数据包必须声明为final或编译器抱怨,因为SwingWorker是一个内部类。这引发了以下关于如何以及何时可以为此变量赋值的问题:

  1. Final to me意味着变量只能赋值一次。但由于声明是方法签名的一部分,我不知道这在这种情况下意味着什么。
  2. 我总是假设在实例化类时为最终变量赋值,但是在调用方法时分配它。传递给方法的变量是否也需要声明为final并在类的构造函数中赋值以使其工作?
  3. 我是否可以使用不同的数据包值或者因为变量被声明为final而多次调用该方法,这是否意味着如果我想使用不同的值调用该方法,我需要为每个新值重新实例化该类变量
  4. 提前感谢您的帮助。

    埃利奥特

4 个答案:

答案 0 :(得分:4)

  

<强> 1。对我而言,最终意味着变量只能被赋值一次。但由于声明是方法签名的一部分,我不知道这在这种情况下意味着什么。

这只是意味着您无法将新值重新分配给变量packet

  

<强> 2。我总是假设在实例化类时为最终变量赋值,但是在调用方法时分配它。传递给方法的变量是否也需要声明为final并在类的构造函数中赋值以使其起作用?

您也可以拥有本地最终变量。适用相同的规则,但它们与构造函数/ this引用无关。

  

<强> 3。我可以使用不同的数据包值调用该方法多次,或者因为变量被声明为final,这是否意味着如果我想用不同的值调用该方法,我需要为变量数据包的每个新值重新实例化该类?

您可以使用不同的值多次调用该方法。 packet变量就像一个局部变量。和否,您不需要为每个值/调用重新实例化该类。

进一步阅读:

答案 1 :(得分:1)

内部类只能引用最终变量,因为想要的变量实际上作为参数传递给内部类ctor。如果变量不是final,并且在创建内部类之后更改,则它将不再保留当前但前一个变量。为了避免这种陌生感并保持简单,变量/参数必须是最终的,才能让内部类读取。

答案 2 :(得分:1)

  

对我而言,最终意味着只能为变量赋值       一旦。但因为声明是签名的一部分       方法,我不知道这意味着什么。

这意味着同样的事情,你无法重新分配变量。

// this compiles
public void foo(String bar){
   bar = "xyz";
}

// this doesn't
public void foo(final String bar){
   bar = "xyz";
}
  

我总是假设最终变量在分配值时   该类已实例化,但在此处调用该方法时会分配该类。

不,局部变量也可以是最终的,参数也是。每个范围(块或方法级别)分配一次。

  

传递给方法的变量是否也需要       声明final并在类的构造函数中为此指定       工作?

不,这完全不相关

  

我可以使用不同的数据包值多次调用该方法   或者因为变量被声明为final,这是否意味着如果我   想要用不同的值调用方法,我需要重新实现   变量包的每个新值的类?

不,见上文。它是每个方法调用的新变量。

答案 3 :(得分:1)

  

对我而言,最终意味着变量只能被赋值一次。但由于声明是方法签名的一部分,我不知道这在这种情况下意味着什么。

同样的事情。这意味着您不能将新值重新分配给包含参数的局部变量(无论如何这被认为是不好的做法)。

  

我总是假设在实例化类时为最终变量赋值,但是在调用方法时分配它

第一部分适用于最终实例变量,而不适用于局部变量。

但是这个想法是一样的:他们需要被分配一个值,它只能发生一次。

  

我可以使用不同的数据包值调用该方法多次,或者因为该变量被声明为final,这是否意味着如果我想使用不同的值调用该方法,我需要为每个新值重新实例化该类变量包?

你可以多次打电话。声明为final的参数对方法的代码调用没有影响(仅用于其实现)。