2011-09-07 22 views
3
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方法的签名。变量数据包必须声明为最终的或编译器抱怨,因为SwingWorker是一个内部类。这引发了以下问题:我如何以及何时可以为这个变量赋值:在Java SwingWorker方法签名中使用final变量

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

在此先感谢您的帮助。

埃利奥特

+0

请阅读http://stackoverflow.com/questions/7053865/cant-get-arrayindexoutofboundsexception-from-future-and-swingworker-if-thread,...以避免从SwingWorker&Future 丢失错误,特别是post通过@trashgod – mKorbel

回答

4

1.最终对我来说意味着该变量只能使用一次分配一个值。但是由于声明是方法签名的一部分,我不知道在这种情况下这意味着什么。

它只是意味着你不能重新分配新的值给变量packet

2.我一直认为当类被实例化最终变量赋值,但这里的时候,该方法被称之为分配。传递给方法的变量是否也需要声明为final并在类的构造函数中分配以使其工作?

你可以有本地最终变量为好。相同的规则适用,但它们与构造函数/ this参考无关。

3.我可以调用该方法多次使用不同的值进行分组或者因为变量声明为final,这是否意味着,如果我想调用不同值的方法,我需要重新实例变量包的每个新值的类是什么?

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

此外SO读取:

1

原因是wantd实际上为变量传递到该内部类只能引用最终变量内部类ctor作为参数。如果该变量不是最终的,并且在创建内部类之后进行更改,它将不再保留在当前但前一个变量上。为了避免这种奇怪现象并使事情变得简单,变量/参数必须是内部类读取的最终结果。

1

对我来说,最终意味着该变量只能赋值 一次。但是因为声明是方法签名的一部分,所以我不知道在这种情况下这意味着什么。

它意味着同样的事情,你不能重新分配变量。

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

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

我一直认为当 类实例化最终变量赋值,但这里的时候,该方法被称之为分配。

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

是否传递给方法还需要 声明为final,并在类的构造函数分配给这 工作的变量?

不,那是完全不相干的

我可以调用该方法多次使用不同的值进行分组 或因变量声明为final,这是否意味着,如果我 要呼叫的方法具有不同的值,我需要重新实例化该类的每个新值的可变分组?

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

1

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

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

我一直认为当类被实例化最终的变量赋值,但这里的时候,该方法被称为

这第一部分是真正的最后的实例变量,不能为局部变量被分配。

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

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

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