我来自C编程背景。我想了解在返回值的情况下编写Java API的最佳方法是什么,但它可能无效。
我有一个实现二叉搜索树的类。它有一个方法getRootValue(),它返回root的值。
C代码 -
df.groupby(['SERIES1', 'SERIES2']).min()
SERIES3
SERIES1 SERIES2
A 1 10
2 4
B 1 1
C 1 7
在用户端,这就是它的样子 -
boolean getRootValue(int *answer) {
if (root != null) {
*answer = value;
return TRUE;
} else {
return FALSE;
}
}
调用此函数的用户将检查返回值,如果返回值为if (getRootValue(&answer)) {
//process valid answer
}
,则仅将answer
视为有效。
Java框架代码 -
TRUE
用户结束 -
package algorithm;
class bst {
node root;
class node {
int value;
node left;
node right
}
//getRootValue()
}
在Java中,什么是正确的方法(考虑到只有BST而不是用户知道root)?我们应该发送一个包含布尔值和答案的特殊类对象吗?如果是这样,这个类应该在哪里定义?
有不同的方法吗?我应该对我的bst类实现有不同的看法吗?
以前有一些问题询问如何返回多个值。这不是我的问题。我想知道实现这种特殊情况的理想方法,甚至可能不需要返回多个对象。
答案 0 :(得分:2)
我甚至不会写这个方法。你需要一个特定的方法来获得它的价值,根本没有什么特别之处。整个方法是多余的。你需要一些东西来获得根,你需要一些东西来从任何节点(及其左右儿童)中获取价值。
我会写两个方法:
Node Tree.getRoot()
int Node.getValue()
。通过从null
返回getRoot()
来满足您提到的例外情况,来电者可以轻松检测到这一情况。
答案 1 :(得分:2)
从Java 8开始,您可以使用Optional作为不确定答案的回报。
Optional<Integer> getRootValue() {
return root != null ? Optional.of(value) : Optional.empty();
}
然后客户端代码可以使用lambda表达式来平滑地处理该值(如果存在)。
getRootValue().ifPresent(value -> {
// process the value
System.out.println(value);
})
答案 2 :(得分:1)
不确定这是否是执行此操作的绝对最佳方式,但在Java中,我建议创建/使用异常。然后,用户可以根据是否抛出异常来测试返回值是否有效。
int getRootValue(int answer) throws Exception{
if (root != null){
return value;
}else{
throw new NullPointerException("Root is null");
}
}
在用户端
try{
myVal = getRootValue(answer);
}catch(Exception e){
e.printStackTrace(); //There was an error here
}