2012-08-09 75 views
2

在方法內部使用匿名內部類時,當我們想要在匿名內部類中使用方法參數時,我們必須將其標記爲final。 這裏的一些細節: Why do we use final keyword with anonymous inner classes?實例屬性的匿名內部類聲明,使用另一個實例屬性

但是,當使用類屬性而不是方法本地屬性會發生什麼?

簡單的用例:用番石榴功能的春季服務:

protected LovValueDAO lovValueDAO; 

private final Function<String,LovValue> LOV_ID_TO_LOV = new Function<String,LovValue>() { 
    @Override 
    public LovValue apply(String input) { 
     return lovValueDAO.findById(input); 
    } 
}; 

@Required 
public void setLovValueDAO(LovValueDAO lovValueDAO) { 
    this.lovValueDAO = lovValueDAO; 
} 

它是安全的聲明這樣的番石榴功能? 根據我的測試,它工作正常,但發動機罩後面發生了什麼?

初始化順序是:

  • 功能被初始化
  • lovValueDAO被彈簧通過 設定器注入

因此我想,因爲函數首先被初始化,即lovValueDAO在函數內使用的屬性不會是引用的副本,而是引用本身,因爲一旦DAO被真正注入,它就可以正常工作。

我正確嗎?


如果我使用此代碼發生什麼:

private final Function<String,LovValue> LOV_ID_TO_LOV = new Function<String,LovValue>() { 
    @Override 
    public LovValue apply(String input) { 
     return lovValueDAO = null; 
    } 
}; 

會後,我調用函數我外面屬性protected LovValueDAO lovValueDAO;被設置爲空?

回答

4

內部類持有其外圍實例this的隱式引用(即,在其中它被創建的上下文其聲明的類的實例),從而獲得了聲明類的字段被作爲一個正常的場處理通過該參考進行訪問。

因此,你的內部類將看到該字段的當前值,並且可以改變它。