看看这个:
public class Main {
private static List<Integer> list = new ArrayList<>();
public static void add(int x) {
if(list.contains(x)) {
return;
}
list.add(x);
}
public static void main() {
list.add(1);
list.add(1); //should it do nothing or throw an error?
}
}
此外,请忽略我可以使用Set<Integer>
来消除对if(list.contains(x))
的需求
无论如何,假设list
不能有重复项,并且还假设在任何时候意外添加了副本(例如:第二个list.add(1)
)应该被视为错误;如果我不需要,我不想添加重复项。
底线是:add(int x)
应该抛出异常(如IllegalArgumentException
或其他什么)?我明白,如果我没有,我不需要担心它会导致涉及重复的实际错误,因为它在第二次添加时不会做任何事情,但它仍然困扰我一点,在某些时候是不必要的{可以调用{1}}。
我见过类似于add()
的代码,它会检查某些东西,并且根据它不做任何事情。希望你可以将这个想法应用到你以前做过的事情上。
无论如何,我甚至都不知道。我是否应该像以后类似的问题一样继续上述类似问题,还是应该抛出异常呢?
答案 0 :(得分:4)
两者都是,这取决于您想要达到的目标。对于集合,添加非唯一元素应该什么也不做,并且不是特殊情况。对于唯一元素的列表,添加非唯一元素可能是一种特殊情况,并且应该引发异常。 这不是编程的问题,而是建模的问题:你的对象认为是正常的,什么不是。没有一个“最好”的答案。
例如,如果您想跟踪哪些开发人员今天完成了任何工作,您可以将它们添加到worked
集。如果开发人员今天做了另一次提交,并且你添加了他,他仍然只是“完成了工作”,这不是一个例外情况;只需返回而不更改列表。
但是,如果您正在处理就业记录并聘请开发人员,而他实际上已经在您的工作中,这是一种特殊情况,应该提出错误。
答案 1 :(得分:0)
这取决于您的要求。我做的方法总是有条不紊地做任何事情。但是,如果您的需求需要一些错误检测,则应该抛出异常。