我实现了一个Queue,然后在它周围实现了一个名为ImplementStackUsingQueue的包装器。注意--我的问题与实现的准确性或逻辑无关。它只关心异常处理。
队列实现看起来像这样
public synchronized boolean add(int x) {
if (currentSize == maxSize) {
throw new IllegalStateException("The queue is full: front size: " + rear);
}
queue[rear++] = x; // USE.
rear = (rear + 1) % maxSize; // NEXT.
currentSize++;
return true;
}使用此队列实现堆栈的包装器如下所示:
public void push(T x) {
queue2.add(x);
queue2.addAll(queue1);
queue1 = queue2;
queue2 = new LinkedList<T>();
}现在,我的包装器将依赖底层的Queue来抛出IllegalStateException。我的问题是-依赖底层组件抛出异常是一种好的做法,还是值得在ImplementStackUsingQueue中复制异常处理条件currentSize = maxSize,并在控制转到底层之前处理异常?
发布于 2014-05-30 15:15:50
这个话题是高度基于意见的,但多年来已经形成了一些共识。其中之一就是"Don't use exceptions for flow control"
对于发布的代码,如果不可能将元素添加到队列中,则只返回false会更有意义。
现在,对于你的问题“依赖底层组件抛出异常是不是很好的做法”?如果异常被抛出到控制流,则否。
“是否值得在ImplementStackUsingQueue中复制异常处理条件currentSize = maxSize,并在控制转到底层之前处理异常?”不,底层应该只指示它是否可以将元素添加到队列中:
public synchronized boolean add(int x) {
if (currentSize == maxSize) {
return false; // indicate in the javadocs when the false is returned
}
queue[rear++] = x; // USE.
rear = (rear + 1) % maxSize; // NEXT.
currentSize++;
return true;
}很难知道“推送”在做什么,因为queue1和queue2可以在其他地方修改或使用。如果可以隔离对队列的更改,那么如果不可能将元素添加到队列中,那么"push“返回false应该是可以的。如果队列不接受null元素,那么如果不可能将元素推入队列,则可以返回null,否则,返回推入的元素。但请注意,“推送”抛出异常是完全没有问题的。例如,如果queue2为空,它可能会抛出NPE。
同样,这是高度基于观点的,所以对我的观点持保留态度。
https://stackoverflow.com/questions/23948345
复制相似问题