我知道有多种方法可以返回多个结果并将其分解,但这感觉很麻烦。
对于练习我正在做二次方程求解器。显然,当需要多个返回值时会出现这种情况。我只是想知道处理这样一个案例的首选方式是什么 - 我不是在寻找变通办法(返回一个字符串并将其分成两部分等),因为我是为了某种一般的“最佳实践”干净/样式良好的代码
答案 0 :(得分:11)
简答:创建一个封装结果的类,并返回该类的实例。
稍微扩展的版本: Java: returning two ints from a method call
我理解它的感觉是多么“混乱”。 编写“纯”Java风格的编码可以产生这种效果,因为你最终会为所有内容创建类,并且它真的感觉有点过分(相信我,我也用Python代码,这个真的得到了我)。但对于“干净”的做法,我没有看到很多解决方案。任何其他假设调用您的实现的方法都知道通过接口不明确的细节,例如,您返回的String应该如何解析,等等。
它似乎有点矫枉过正,但从长远来看,它会使你的代码(以及使用它的代码)更具可读性,并且有很长的路要走(如个性)。
答案 1 :(得分:2)
在这种特定情况下,为什么不根据需要返回一个数组或其他一些集合对象呢?在更复杂的情况下,您应该创建一个包含所有适当信息的类,并返回该实例。
答案 2 :(得分:1)
如上所述,一种方法是返回包含所有结果的数组或集合。但是,这种方法可能会让您对哪个返回值存储在哪里感到困惑。您可以执行以下操作:
public static final String TEMPERATURE = "TEMPERATURE";
public static final String SPEED = "SPEED";
//...
public Map<String, int> doSomeStuff(){
Map<String, Object> map = HashMap<String, int>();
// Calculations here...
map.put(TEMPERATURE, 1);
map.put(SPEED, 2);
//...
return map;
}
// You can then retrieve all results by
int temp = map.get(TEMPERATURE);
int speed = map.get(SPEED);
答案 3 :(得分:0)
正如其他人所提到的,您可以返回用于保存所有结果的容器类的实例。
或者,您可以传入方法填充结果的容器对象,然后在调用后将其拉出。这对于返回“额外”信息的方法重载非常有用:
public String compute(int arg) {
return compute(arg, null);
}
public String compute(int arg, MyContainer<String> extraInfoOut) {
String answer = ...
if (extraInfoOut != null) {
String extraInfo = ...
extraInfoOut.set(extraInfo);
}
return answer;
}
...
MyContainer<String> container = MyContainer.empty();
String answer = compute(someInt, container);
String extraInfo = container.get();