gpt4 book ai didi

java - 同一方法的两个版本仅在其签名(方法名称和 'throws' 属性)上有所不同是否被认为是糟糕的设计?

转载 作者:搜寻专家 更新时间:2023-11-01 02:18:59 25 4
gpt4 key购买 nike

我想设计一个 API,其中我有相同方法的两个版本,extractLastElement():

  1. 第一个版本不会有 throws 属性:Object extractLastElementSafe(); 将在客户端“确定”内部有元素时使用集合,例如他刚刚添加了一些元素,因此不需要 try-catch 样板代码。

  2. 第二个版本将抛出检查异常:Object extractLastElement() throws NoMoreElementsException;客户端在不确定集合中是否还有元素时使用,例如在循环中。

这被认为是糟糕的设计吗?是否有其他方法可以模拟此行为?

public class SomeCollection {

private List<String> arr;

public SomeCollection(List<String> arr) {
this.arr = arr;
}

public String extractLastElementSafe() {
return arr.remove(arr.size() - 1);
}

public String extractLastElement() throws NoElementsLeftException {
try {
return arr.remove(arr.size() - 1);
} catch (IndexOutOfBoundsException e) {
throw new NoElementsLeftException(e); // throwing a checked exception
}
}
}

class NoElementsLeftException extends Exception {
public NoElementsLeftException(Throwable cause) {
super(cause);
}
}

最佳答案

让用户能够以不同的方式做同样的事情总是值得怀疑的。强制客户担心最后一个元素是否存在也是不优雅的。

但归根结底,这更多的是一种风格,你的做法可以说是可以的。尽管如此,您还是让您的客户调用“安全”方法并以运行时异常结束。所以最后其实有两种不同的错误场景。

绝对要改变的一件微妙的事情:避免代码重复!执行 try/catch 以抛出该异常的方法应该简单地调用“安全”方法!

综上所述:我个人只会提供一种抛出运行时异常的方法。标准 Java 集合使用未经检查的异常,您也应该这样做。

引用 Robert Martin 的话:“已检查异常与未检查异常之间的 war 已经结束,未检查异常获胜”。他在 10 多年前写了那篇文章。

关于java - 同一方法的两个版本仅在其签名(方法名称和 'throws' 属性)上有所不同是否被认为是糟糕的设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56302231/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com