2011-09-07 27 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的參數對該方法的代碼調用沒有影響(僅爲其實現)。