如何在java中返回多个Integer?

时间:2012-01-11 13:30:07

标签: java reference

我有一个返回错误代码(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,这让我很烦恼! 任何人都可以提供解决方案吗?

=================================

嗯,总之,有这些流动的解决方案:

  1. 将数组作为参数传递
  2. 将包装器作为参数传递
  3. 返回一对
  4. 返回包含错误编号和结果的包装
  5. 抛出异常
  6. 传递mutableint
  7. 第一和第二让我很难受 第3和第4似乎不那么完美 大约5号,这种方法被频繁调用,所以我要考虑效率 6th似乎符合我的要求

    谢谢!

11 个答案:

答案 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(或者可能是回调的结果)并添加参数。根据结果​​类型调用方法。添加尽可能多的参数(在味道内)和方法尽可能有用。典型的调用者将使用匿名内部类,而不必打开错误代码。当然,再次返回封闭方法会引发如何获取数据的问题。