2013-03-04 67 views
5

我似乎创造这两种方法偶尔:在Java方法收集错误,空的ArrayList与LinkedList的

// return null on errors, and append errors to 2nd param, otherwise return result 
String fetchSomething(String parameter, List<String> errorMessagesOut); 

// return empty list or null on no errors, otherwise list of errors 
List<String> verifySomething(String parameter); 

然后该代码调用这些将加入适当的分离器的错误列表(例如如简单的逗号,换行符,HTML标签...),通常使用Apache Commons Stringutils.join方法。在正常情况下,没有错误,列表将为空。

于是,我开始想知道这两个问题:

  1. 你看到返回的错误信息字符串作为列表中的问题?如果是这样,有什么更好的选择? (不例外,这将通过调用这些方法,我们只是想在代码中抛出。)

  2. new LinkedList()new ArrayList(0)new ArrayList()的列表,它是预期保持空越好,通常应该只有序列迭代器访问时它不是空的?


编辑:示例用例:

List<String> verifyParameters(JSONObject params) { 
    List<String> ret = new ArrayList<String>(0); 

    if (!verifyKey(params.get("key"))) 
     ret.add("Invalid key: " + key); 

    if (!verifyAccess(params.get("user"), params.get("pass"))) 
     ret.add("Authentication error"); 

    return ret; 
} 

...

List<String> errors = verifyParameters(params); 
if (!errors.isEmpty()) { 

    connection.sendErrorListMessage(errors); 
    logger.warn(StringUtils.join(errors, ", ")); 
    controlPanel.show("Errors: \n- " + StringUtils.join(errors, "\n- ") + '\n'); 
    throw new AbortException("invalid params); // or maybe return false/null; 
} 
// proceed with valid params 

通常处理错误列表不会有所有这些,它只是试图说明错误列表是指供人类看到的消息列表,与它将如何显示无关,也与处理d无关/有用不同的错误不同。

+3

保持简单,使用'new ArrayList()'。如果以后看到问题,请将其更改为“新的ArrayList(0)”或甚至是“新的LinkedList()”。微型优化是所有邪恶的根源 – 2013-03-04 16:30:36

+0

@LuiggiMendoza - 我喜欢你能够在五分钟内使用这个报价两次:) nice – cowls 2013-03-04 16:31:58

+0

LinkedList当然,作为拟合的数据结构。返回一个列表而不是让一个参数被填充,更具可读性。 – 2013-03-04 16:39:11

回答

3

我认为使用字符串列表很好。我会倾向于做一个专门的Result类至少fetchSomthing,使之像这样的,特别是如果通过了errorMessagesOut是永远除了一个新的空列表什么:

Result result = fetchSomething(String parameter); 
if (result.hasErrors()) { 
    List<String> errors = result.getErrors(); 
} else { 
    String fetched = result.getValue(); 
} 

然后,我会也把任何方法这个过程对此类错误字符串也是如此,你可以这样做:

String errorMessage = result.getErrorString(); 

此封装的错误数据和它的一个类中的格式和手段,在没有错误的情况下,你不需要在你的Result实例内部创建任何List。

我上面的几点主要是关于代码设计。如果没有分析和基准测试来比较任何变化的结果,尝试微观优化是毫无意义的。

1

这些错误是什么?你打算做一些关于方法返回错误的商业决策吗?否则,如果这些错误仅用于记录日志,那么简单的日志记录解决方案就会提示错误一旦发生就会被记录下来。我正在谈论那些logger.debug("Error message");

无论如何,你能否给我们一个例子,说明这些错误返回后会做什么?

有一件事我一点,虽然:它往往如果您使用的是相同的数组/列表/集合两者的处理结果和错误会造成混淆。如果您的方法返回了错误列表(或者在没有错误的情况下为空/空列表),那么也会令人困惑,因为看起来错误是执行方法的结果。

+0

我加了一个简单的例子用法。无论如何,意图是得到*所有*错误,而不是放弃在第一个。 – hyde 2013-03-04 16:51:02

1

尝试使用列表收集所有错误信息没有任何问题。 使用ArrayList将工作正常,无需担心...

如果你知道有没有错误,你可以return Collections.emptyList();

一般具有收藏避免返回两个null或空列表。我总是使用空列表,因为不会中断循环。

1

您是否看到将错误消息字符串作为列表返回的问题?如果 那么有什么更好的选择?

不,如果在那里解决您的问题,使用列表没有任何问题。

new LinkedList()new ArrayList(0)new ArrayList()为 名单预计将保持为空越好,通常应该有 仅顺序访问迭代器时,它不是空的?

了解有关名单有多少元素去存储和实例列表与能力不会有性能的任何显著的改善:

每个ArrayList实例都有一个容量。容量是用于存储列表中元素的数组的大小 。它始终在 至少与列表大小一样大。当元素被添加到ArrayList时,其容量会自动增加。增加 政策的细节没有被规定,除了添加一个元素具有不变的摊销时间成本。

你但是保存new ArrayList(0)一些内存,如果该列表是最常见的空的,因为没有指定初始容量时,列表的大小被初始化为10