2017-07-06 337 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

相关问题