我有一个返回错误代码(int)和结果(int)的方法。如果错误代码为 0 ,则结果有效。 在c ++中,这可能是:
int method(int& result);
Java通过引用调用,因此如果我们更改方法中的对象,则调用者可以看到更改。但是,int不是一个类,所以我在java中无法做到这样:
int method(int result);
并且Integer和Long在Java中是不可变的,因此如果我这样做,调用者就无法看到更改:
Integer method(Integer result);
将结果包装到Wrapper Class中!但是,这不是那么简单!
我长期使用c ++并最近转到java,这让我很烦恼! 任何人都可以提供解决方案吗?
=================================
嗯,总之,有这些流动的解决方案:
谢谢!
答案 0 :(得分:4)
不要对错误代码使用返回码:使用例外;这就是它们的用途。只需返回实际结果。
答案 1 :(得分:3)
您不能为您的方法返回多个整数。你能做的是:
创建一个包含2个整数字段的新对象,让你的方法返回该对象的实例(基本上是一个包装器);
让您的方法返回一个包含2个整数的数组(或将其作为参数);
使您的方法返回<int 1>,<int 2>
形式的String变量。然后,您可以使用split()从字符串中获取数字并将其解析为整数。
让您的方法抛出异常并返回数字。
答案 2 :(得分:2)
你是正确的,你需要包装值。如果对method
的调用不会太频繁,请考虑抛出异常以报告失败并以其他方式退出。那将是Java风格最多的方法。我也在我的C ++代码中使用这种模式(我不喜欢输出参数和相同方法中的返回值,除非有其他压力需要它)。
但是,性能有时需要您使用的更多C-system-call-ish样式。在这种情况下,我建议您构造一个Result类型和一个可以设置值的错误类型。
要考虑的其他事情是拥有一个名为TwoTuple<TYPE1, TYPE2>
的Generic(读“模板化”)类,您可以使用它来传递值对。我发现在Java中我做了很多配对传递,尽管这可能是我个人风格的衍生物。 :)
答案 3 :(得分:1)
我建议创建一个自定义对象来保存这两个数据,例如
public class ResultData {
private int result;
private int errorCode;
public ResultData(int errorCode, int result) {
this.result = result;
this.errorCode = errorCode;
}
// Getters...
}
然后你的方法变成:
public ResultData method() {
// Do stuff
return new ResultData(error, result);
}
或者,正如其他答案所建议的那样,使用Exceptions表示是否发生了错误,如果方法返回结果,则可以始终确保它是有效的。捕获异常表示发生了错误,您可以按照处理errorCode的方式处理它。
答案 4 :(得分:1)
有两种方法可以处理这种情况: - 1.为错误代码设置一个特殊值,以便将它们与结果值区分开(如果可能的话)。例如,如果列表中不存在该元素,则java的ArrayList中的indexOf()方法返回-1,否则返回正索引。 2.对错误条件使用异常,并始终将返回值视为正确结果。也就是说,如果方法返回没有任何异常,则假设退出代码为0并将返回值存储到result中。
创建一个自定义对象来存储结果和退出代码可能有点过分。
答案 5 :(得分:0)
不是很好,但是:
int method(int[] result) {
result[0] = 1; // set result[0] as your out value
// etc.
}
使用数组为单个int创建“人工引用”。
答案 6 :(得分:0)
在Java中返回错误代码不是一个好习惯。而是使用例外...并列出多元组值......
List<Integer> method(Parameter... paramteters)
{
List<Integer> listOfValues = ...
//some calculations
if(errorCondition) throw new SomeException();
//more calculations, if needed
return listOfValues;
}
答案 7 :(得分:0)
在您的情况下,如果您有错误,请抛出适当的异常。你在C ++中也有例外。
其他任何内容都是有效的结果。
但是要回答关于如何返回多个值的问题。
我在很多地方使用的方法是使用监听器接口
interface ErrorOrResult {
void onError(int error);
void onResult(int result);
}
a.method(errorOrResultImpl); // can use an anonymous implementation here.
正如您所看到的,可以使用各种参数多次调用不同类型的结果。
您可以返回带有两个字段的Object。这是最面向对象的方式。
如果每次都创建一个对象而烦恼,您可以将对象作为参数传递。
最简单的是您重复使用的int[]
。
int[] results = { 0, 0 };
a.method(results);
一个替代方案是返回一个长的。
long result = a.method();
// split into two int values.
或者使方法有状态。
int error = a.method();
int result = a.methodResult();
或者您可以使用像Collections.binarySearch那样的符号
int errorOrResult = a.method();
if (errorOresult < 0)
int error = ~errorOrResult;
else
int result = errorOrResult;
鉴于有很多替代方案,在允许多个返回值之前可能需要一段时间。
答案 8 :(得分:0)
返回包含两个整数的对象,例如。使用commons-lang v3 Pair
Pair<Integer, Integer> method(){
return Pair.of(a,b)
}
答案 9 :(得分:0)
MutableInt库中有Apache Commons个组件。由于它是可变的,你可以通过引用传递它。
答案 10 :(得分:0)
首先,int
错误代码?一般认为Java很差。异常通常(但执行时很慢)。如果它实际上是常见的和/或性能是至关重要的,那么返回一些有意义的东西。也许是一个不错的新[2004]枚举。
所以一般来说,如何返回多个值。你可以破解它并使用AtomicInteger
或类似的东西。请不要使用阵列!
最好是返回一个有意义的(可能是不可变的)对象。 Pair<,>
不是一个有意义的对象。 (有一些建议可以在将来的语言版本中使这更容易。)
更奇特的方式是传入回调对象。如果结果数据根据可能的结果类型而不同,这将特别有用。让方法返回void
(或者可能是回调的结果)并添加参数。根据结果类型调用方法。添加尽可能多的参数(在味道内)和方法尽可能有用。典型的调用者将使用匿名内部类,而不必打开错误代码。当然,再次返回封闭方法会引发如何获取数据的问题。