【问题标题】:Dealing with list "Optional operation"处理列表“可选操作”
【发布时间】:2015-12-18 13:58:32
【问题描述】:

我正在寻找 List 的 javadoc 以找到一种允许替换元素的方法 ( set(int, E) ),我看到该方法是“可选的”。我搜索了一段时间,发现了另一个 question,Laurence Gonsalves 给出了很好的回答。

但是我还有一个问题,直到现在每次我使用任何接口时,我都没有想到一个实现会抛出运行时异常(除非我使用错误或者它是实现代码中的错误),即使我意外尝试将元素添加到不可变列表时出现异常,我没有意识到发生了什么。

我的问题是:如果我有一个 API 方法有一个 List(或其他接口)参数,该参数必须对该对象调用“可选”操作,我应该如何进行?

  • 我应该避免使用List,而是使用一些实现作为参数吗?
  • 我是否应该制作一份列表的防御性副本,修改它并返回 列表? (这可能会改变 api 客户端使用的实现)

我知道需要更改作为方法中的参数接收的列表是有问题的,但可能有必要

【问题讨论】:

  • 嗨贾罗德。我相信这不是一个重复的问题,我不是在问为什么操作是可选的,我是在问如何处理它。我在我自己的问题中链接了另一个问题,解释了为什么它是可选的,正如我在问题中所说,我阅读了它......

标签: java


【解决方案1】:

Java 库本身始终如一地回答您的两个问题“不”。例如,实用方法Collections.shuffle 接受任何List,如果传递给它的List 不支持必要的操作,则会引发异常。一般来说,坚持这种行为与 Java 库和主要的开发实践是一致的:继续使用 List,就好像它是可变的一样,如果有人传入 List 不支持必要的操作,他们'会得到他们应得的例外。

【讨论】:

  • 嗯,有道理,所以我基本上必须在方法文档中明确说明列表必须是可变的?!
  • 对于“可选”操作,操作可以通过其他方式完成是正常的——例如删除和插入而不是替换元素。可能会带来显着的性能损失,并可能带来不必要的副作用。您可以考虑捕获异常并以“备份”方式进行操作。只要您记录了您的方法在这些情况下的作用,就不会有问题。
  • @DJClayworth 我不希望这是常见的情况——通常我希望如果有另一种方法来支持操作,即使是低效的方法,实施也会继续进行在方法中使用该方法。
  • @RafaelTeles:是的,就是这样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多