2016-04-12 47 views
1

我翻译一些代码,从C#与Java封闭,但我得到了一个错误,代码是这样的:Java和关闭

public ArrayList<String> getData(){ 
    String pSentence = "SELECT * FROM EMPLOYEES"; 
    ArrayList<String> pList = null; 
    _con.queryFB(pSentence, (PreparedStatement ps, ResultSet rs) -> { 

     pList = new ArrayList<>(); 

     try { 
      rs = ps.executeQuery(); 

      while (rs.next()) { 
       pList.add(rs.getString(1) + " : " + rs.getString(2) + " : " + rs.getString(3)); 
      } 
     } 
     catch (Exception ex) { 
     } 
    }); 
    return pList; 
} 

这仅仅是一个封闭执行查询,关闭只是让确保与数据库的连接始终是关闭的,但是我得到的错误是,“pList”方法变量必须是最后才能用在闭包中的,这是我没有用C#处理的问题,好吧,得到一个新的错误,最终var pList无法修改,所以,我所做的就是将pList移出该方法,并将其置于一个私有变量中,如下所示:

private ArrayList<String> pList = null; 

public ArrayList<String> getData(){ 
    String pSentence = "SELECT * FROM EMPLOYEES"; 

    _con.queryFB(pSentence, (PreparedStatement ps, ResultSet rs) -> { 

     pList = new ArrayList<>(); 

     try { 
      rs = ps.executeQuery(); 

      while (rs.next()) { 
       pList.add(rs.getString(1) + " : " + rs.getString(2) + " : " + rs.getString(3)); 
      } 
     } 
     catch (Exception ex) { 
     } 
    }); 
    return pList; 
} 

然后它工作,但是,我想知道是否会有内存泄漏或知道是否有更好的方法来做到这一点,谢谢。

回答

1

您分配封闭,这是在java中不允许的外部声明变量里面的plist中。尝试在变量初始值设定项(List<String> pList = new ArrayList<>();)中构造ArrayList,然后在回调顶部考虑clear(如果数据库实用程序执行重试)。顺便说一句,一个体面的连接管理实用程序应该允许你直接从回调闭包中返回你的结果;我建议寻找这种方法,以完全避免这些问题。

+0

你说得对,我把方法内部的声明和初始化,但在关闭之外,它工作,谢谢。 – user2070369

1

如果您想在方法外部使用pList,那么在外部定义它,但在方法内部使用另一个变量。该内部变量将在方法结束之后被删除,被垃圾收集器,以便将是这样的:

private List<String> pList = getData(); 
// ... do what you want with it 

public List<String> getData() { 
    public List<String> innerPList = new ArrayList<String>(); 
    String pSentence = "SELECT * FROM EMPLOYEES"; 
    _con.queryFB(pSentence, (PreparedStatement ps, ResultSet rs) -> { 
    pList = new ArrayList<>(); 

    try { 
     rs = ps.executeQuery(); 
     while (rs.next()) { 
      innerPList.add(rs.getString(1) + " : " + rs.getString(2) + " : " + rs.getString(3)); 
     } 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 

    return innerPList; 
}); 
0

你的函数不应该都返回结果,并把它分配给一个成员变量。返回结果就足够了。在这种情况下,pList可以是一个局部变量。

如果你希望缓存的结果,这样做,在它调用的getData另一个函数()