2016-04-12 18 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另一個函數()