2015-02-09 187 views
4

我有我的Java方法如下;Java返回空列表

public List<Lookup> findAll(String lang) { 
    Query query = entityManager.createNamedQuery("Lookup.findAll"); 
    if (isValidLang(lang)) { 
     query.setParameter("lang", lang); 
     return query.getResultList(); 
    } else { 
     //return empty list 
    } 
} 

現在該方法返回有效匹配lang的List。

但是,如果不是這種情況,我想返回一個空列表。我的問題是如何更新代碼&什麼是返回空列表的最佳方式,以便代碼不會失敗?

回答

14

這應做到:

} else { 
    return Collections.emptyList(); 
} 
+1

或'new ArrayList()'如果函數調用方想要修改返回的列表。 – emlai 2015-02-09 09:57:13

+1

對於給定的例子,這實際上可能是一個壞主意......如果客戶端修改了返回的列表,它會強制它們進行復制。 'new ArrayList <>(findAll(...))'。最好不要隨機混合不可變/可變。你的回答也沒有解釋'emptyList'會拋出異常。 – Radiodef 2015-02-09 19:50:15

+0

如果這取決於我,我會聲明該方法返回一個'UnmodifiableList',但開箱即用的java沒有這樣的事情。 – 2015-02-09 20:02:43

3

試試這樣說:

public List<Lookup> findAll(String lang) { 
    List<Lookup> result = new ArrayList<Lookup>(); 
    Query query = entityManager.createNamedQuery("Lookup.findAll"); 
    if (isValidLang(lang)) { 
     query.setParameter("lang", lang); 
     result = query.getResultList(); 
    } 
    return result; 
} 
3

Collections.emptyList()返回不可變列表,即列表你不能添加元素如果您想對列表執行任何操作,則創建列表的新實例並將其返回。

if (isValidLang(lang)) { 
     query.setParameter("lang", lang); 
     return query.getResultList(); 
    } else { 
     return new ArrayList<Lookup>(); // return array list instance. 
    } 
1

java使用ternary operator (boolean_expression ? statement1 : statemetn2)我們可以檢查每一個返回類型是否是null。如果我們這樣做一次,那麼每個使用代碼的調用方法都將受益,因爲他們不必檢查null。您的代碼可以像這樣重寫 -

public List<Lookup> findAll(String lang) { 
    Query query = entityManager.createNamedQuery("Lookup.findAll"); 
    ArrayList lookupList = null; 

    if (isValidLang(lang)) { 
     query.setParameter("lang", lang); 
     lookupList = <ArrayList> query.getResultList(); 
    } 

    return (null != lookupList ? lookupList : Collections.EMPTY_LIST); 
}