2014-10-11 59 views
1

在方法內部定義一個新的匿名類是否合法,然後將一個實例分配給外部類專用字段,就像下面代碼中的註釋一樣?我正在學習Java,並試圖讓我的頭在這背後的原因。謝謝!匿名類和外部私有字段

public class Outer{ 
    private int id; 
    private String name; 
    private SwingWorker doSomething; //Is it ok not to include it in the constructor? 
public Outer (int id, String name){ 

    //constructor, but didn't include the instance doSomething 
} 
public void fuctionOne(){ 
    Swingworker doSomething =new SwingWorker<int, Void>(){ 
     protected int DoInBackground(){ 
      ...........// created an anonymous class and override methods 
+2

你試過我嗎?編譯器說什麼? – 2014-10-11 09:02:22

+0

「,然後將匿名類的實例分配給外部類的專用字段」 - >在您的示例中,我看不到您正在執行此操作。您在「functionOne()」中使用新的局部變量「 – 2014-10-11 09:07:11

回答

2
public void fuctionOne(){ 
    Swingworker doSomething = new SwingWorker<int, Void>(){ 
     protected int DoInBackground(){... 

您正在定義,在這裏初始化一個局部變量,而不是分配給Outer類的成員。

如果您想初始化的OuterdoSomething成員,請

public void fuctionOne(){ 
    doSomething = new SwingWorker<int, Void>(){ 
     protected int DoInBackground(){... 

一般情況下,你不必到類的所有成員初始化在構造函數中。如果您不初始化它們,它們會得到默認值(參考類型爲null)。您只需確保在實際使用它們之前對它們進行初始化。

+0

謝謝!對不起,我沒有得到區別。將它分配給Outer類的私人領域的情況如何? – stillAFanOfTheSimpsons 2014-10-11 09:12:36

+0

@ user4056620正如我寫的,這非常好。 – Eran 2014-10-11 09:14:55

+0

啊我明白了!謝了哥們。 – stillAFanOfTheSimpsons 2014-10-11 09:25:36

1

是的,這是完全合法的。一對夫婦的事情要記住,當你通過這些訪問規則思考:

  1. 就目前情況來看,你已經有了一個局部變量doSomething多數民衆贊成你的陰影字段實例,如伊蘭說。你需要避免這種情況,否則你根本不會設置字段實例。
  2. 內部類可以訪問外部類的所有內容,包括其private方法和字段。任何private只能在其定義的類中訪問,但重點在於內部類內部的外部類。
  3. 內部類也可以訪問在其外部定義的局部變量(只要它們在範圍內),但它們必須聲明爲final
+0

謝謝!所以我這樣做的方式是使doSomething一個局部變量。但是對於像這樣的SwingWorker這樣的內部類,它是否可以是一個私有類變量,因爲我們可能需要在其他類中創建一個Outer實例? – stillAFanOfTheSimpsons 2014-10-11 09:18:30

+1

是的,當然。您的代碼中包含實例字段和局部變量。如果你想在一個實例字段中刪除本地變量。 – 2014-10-11 09:36:20

1

作爲一般規則:如果它編譯,它是允許的。是的,允許將匿名類實例分配給專用字段。

但是在你的代碼中,你沒有分配任何東西給該字段。你需要的,如果你想使這更清楚地糾正你的代碼如下

public class Outer{ 
    private SwingWorker doSomething; 

    public void functionOne(){ 
    //SwingWorker doSomething = ...;//incorrect 
    doSomething = ...;//correct 
    } 
} 

,你可以隨時使用

this.doSomething = ... ; 

雖然在一般情況下,你的IDE指示你的局部變量之間的區別並通過調整文字顏色來調整字段。

現在的問題是,這是一件好事情。

  • 當你創建類,字段的值是null
  • 你有哪些分配一個值的字段,它可以在任何的時間被稱爲公共方法。您無法控制何時調用該方法。
  • 您可能有另一個(公共)方法將使用該字段。這意味着該方法必須能夠處理null值,或將該變量實例化爲默認值。

所以,你最終得到一個具有公共方法的類,它必須以特定的順序被調用,才能使類正常/按預期工作。這通常不是最好的設計選項,因爲它很容易忘記排序,並以錯誤的順序意外地調用方法。

+0

很好解釋。加上文本顏色提示是非常有用的。 – stillAFanOfTheSimpsons 2014-10-11 09:29:12