基于条件让方法“什么都不做”是一个好的实践吗?

3

看一下这个:

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)),则应视为错误; 如果没有必要添加重复项,我就不想添加。
关键是:是否应该改为抛出异常(例如IllegalArgumentException)而不是使用add(int x)? 我明白,如果我不这样做,我就不用担心它会在实际存在重复的情况下引起错误,因为它在第二次添加时只会保持原状,但是有点困扰的是,在某个时间点上可能会调用一个不必要的add()
我曾经看到过类似于add(int x)的代码,检查某些内容,然后基于那些内容什么都不做。希望您可以将此思想应用于您之前遇到的问题。
无论如何,我甚至不知道。以后是否应像上面那样继续,或者应该抛出异常?
2个回答

5
根据您想要实现的目标,两者都可以。对于集合而言,添加一个非唯一元素不应该产生任何影响,并且也不是异常情况。对于唯一元素的列表而言,添加一个非唯一元素可能是一个异常情况,应该引发异常。这并不是编程问题,而是建模问题:您的对象认为什么是正常的,什么不是。没有一个“最好”的答案。
例如,如果您想要跟踪哪些开发人员今天有工作,您可能会将他们添加到“worked”集合中。如果一个开发人员今天进行了另一次提交,您再次将其添加到列表中,这仍然只是“完成了工作”,而不是异常情况;只需返回而不更改列表即可。
但是,如果您正在处理就业记录并雇用一个已经在职的开发人员,则这是一个异常情况,应该引发错误。

说到这一点,如果不是异常情况,请考虑是否希望调用者能够知道他/她是否遇到了“什么也不做”的条件。举个具体的例子:java.util.Set的add和addAll方法。两者都返回布尔值,其中“false”表示您遇到了“什么也不做”的条件。 - Dennis Meng

0

这取决于您的需求。我经常使用有条件什么都不做的方法。但是,如果您的需求需要一些错误检测,那么您应该抛出异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接