“缩容的值不能为0"这个条件有什么意义?
老师您好,我在实现循环队列处理出队操作涉及缩容条件处理时,按我的理解是当把队列所有元素出队之后队列的信息时size=0,capacity=1,我再执行出队操作会因为Queue Is Empty而报错,也不可能再有机会执行后面的缩容操作,那么getCapacity() / 2 != 0这个条件有意义吗?
谢谢回答!
1 2 3 | if(size == getCapacity() / 4 && getCapacity() / 2 != 0){ resize(getCapacity() / 2);} |
正在回答
在我们的实现下,不会出问题。
但比如我们再实现一个构造函数,这个构造函数是根据一个外界已有的静态数组,创建一个动态数组 Array 类,构造函数类似这样(印象里我在课程中提及过我们可以设计这样一个接口):
1 | public Array(E[] arr) |
如果在这种情况下,我们创建的 data 和传来的 arr 一样大,且 size 也是 arr.length,那么如果用户传来的这个静态数组中只有 1 个元素,在删除这个元素的时候就会出问题。
==========
当然,你仍然可以 argue 我们可以使用各种其他手段避免它出问题,但从逻辑上,我们这样写程序,其实根本不需要考虑这种情况是否会出现。我们下面要调用 resize(k),其中的 k 不能是 0,那么很自然的,我们在调用前,就应该判断 k 不为0。
换句话说,我们下面调用 resize(data.length / 2);,那么一个好的编程实践就是,我们判断确保 data.length / 2 != 0。即使在当下的逻辑下,这种情况不可能发生。在现代编程中,多的这个判断对性能的影响可以忽略不计。
这被称为是防御型编程。因为,你不确定在后续,你(或者其他人)会如何修改你的代码,使得这个条件变得有可能触发,从而产生错误。防御型编程可以让程序更健壮。
继续加油!:)

恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧