2017-07-06 151 views
0

如何從方法內創建的隱式對象內部訪問外部變量?如何在匿名內部類中使用外部變量

public void insertMaterial() { 

new Thread(){ 

    public void run(){ 
    com.ssn.acx.api.configuration.ParameterSet ps = com.ssn.acx.api.ACXObjectFactory.getConfigurationFactory().getLocalConfiguration().getParameterSet(com.ssn.acx.api.persistence.ACXPersistenceFactory.CFG_DEFAULT); 
    com.ssn.acx.api.persistence.ACXPersistenceFactory factory = com.ssn.acx.api.ACXObjectFactory.getPersistenceFactory(ps); 
    com.ssn.acx.api.persistence.ACXPersistenceSession session = factory.openSession(); 
    com.ssn.acx.api.common.transaction.ACXTransaction tx = null; 
    WMSMaterial mat = null; 

    try { 
     tx = session.beginTransaction("InsertMaterial");      

     mat = new WMSMaterial("101", "Baby Lotion"); 
     session.getPersistenceSession().insert(mat);   

     mat = new WMSMaterial("102", "Bubble Gum"); 
     session.getPersistenceSession().insert(mat); 

     mat = new WMSMaterial("103", "Soda"); 
     session.getPersistenceSession().insert(mat); 

     tx.commit(); 

    } finally { if (tx != null && !tx.closed()) { tx.rollback(); } session.close(); }//end of try-catch-finally block 

    }//end of run method 

}.start(); //end of Thread Object creation 


} //end of insertMaterial method 

例如,我需要,如果它被傳遞給insertMaterial()方法ARGS來自屬於隱線程對象run()方法中,而不是創建線程對象內部Material對象不得不Material對象訪問。

+1

使用'final'或類成員。 –

+1

或者,在Java 8中,確保該變量*有效最終*。也就是說,即使你沒有明確地標記「final」,你也不需要做任何修改。 –

回答

0

JLS 8.1.3. Inner Classes and Enclosing Instances

當一個內部類(其聲明不發生在一個靜態 上下文)指的是一個實例變量,它是一個 詞法封閉類的一個成員,所述相應的可變詞彙 封閉實例被使用。

任何局部變量,形式參數,或使用了何種異常參數,但在 一個內部類沒有聲明必須聲明爲final。

這意味着可以只使用一個變量或封閉類構件final匿名內部類。

/* 
* I suggest this solution, but not this approach, 
* please be careful with multi-threading programming. :) 
*/ 

// [...] 
// private List<WMSMaterial> listMaterials; // or using a class member 
// [...] 
public void insertMaterial(final List<WMSMaterial> listMaterials) { 

new Thread(){ 

    public void run(){ 
    com.ssn.acx.api.configuration.ParameterSet ps = com.ssn.acx.api.ACXObjectFactory.getConfigurationFactory().getLocalConfiguration().getParameterSet(com.ssn.acx.api.persistence.ACXPersistenceFactory.CFG_DEFAULT); 
    com.ssn.acx.api.persistence.ACXPersistenceFactory factory = com.ssn.acx.api.ACXObjectFactory.getPersistenceFactory(ps); 
    com.ssn.acx.api.persistence.ACXPersistenceSession session = factory.openSession(); 
    com.ssn.acx.api.common.transaction.ACXTransaction tx = null; 

    try { 
     tx = session.beginTransaction("InsertMaterial");      

     for (WMSMaterial material : listMaterials) { 
      session.getPersistenceSession().insert(material); 
     } 

     tx.commit(); 

    } finally { if (tx != null && !tx.closed()) { tx.rollback(); } session.close(); }//end of try-catch-finally block 

    }//end of run method 

}.start(); //end of Thread Object creation 


} //end of insertMaterial method 

[更新]

由於@AndyThomas在評論中指出,Java的8具有有效最終變量,你並不需要顯式地標記一個變量final

某些未聲明爲final的變量將被視爲有效最終

  • 它沒有被宣佈爲最終。

  • 它從不出現在賦值表達式 的左側。 (請注意,包含 初始值設定項的局部變量聲明符不是賦值表達式。)

  • 它永遠不會發生作爲前綴或後綴增量的操作數或遞減運算符。

JLS 4.12.4. final Variables

+0

@AndyThomas謝謝你,+2提供有效的最終建議。 :D我會更新答案。 –

+0

謝謝你回答我的問題!它現在有效。 – Adam