Как вернуть несколько Integer в Java? - PullRequest
5 голосов
/ 11 января 2012

У меня есть метод, который будет возвращать код ошибки (int) и результат (int).Если код ошибки 0 , результат действителен.В c ++ это может выглядеть так:

int method(int& result);

Java-вызовы по ссылке, поэтому, если мы изменим объект в методе, изменение будет видно вызывающей стороне.Но int - это не класс, поэтому я не могу сделать так, как это описано в java:

int method(int result);

И Integer и Long являются неизменяемыми в Java, поэтому изменение, вызывающее их, не будет видно, если я это сделаювот так:

Integer method(Integer result);

Оберните результат в класс Wrapper!Но это не так просто!

Я долго работаю с c ++ и недавно переехал в Java, это меня очень беспокоит!кто-нибудь может предложить решение?

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

ну, в заключение, есть следующие текущие решения:

  1. передать массив в качестве параметра
  2. передать оболочку в качестве параметра
  3. вернуть пару
  4. возвращает оболочку, содержащую номер ошибки и результат
  5. исключение throw
  6. передать мутабильный текст

1-й и 2-й делают мои приложения 3-м и 4-м, кажется, нетнастолько хорошо, что 5-ый, этот метод часто вызывается, поэтому я должен принять во внимание эффективность 6-й, кажется, соответствует моему требованию больше всего

спасибо!

Ответы [ 11 ]

4 голосов
/ 11 января 2012

Не используйте коды возврата для кодов ошибок: используйте исключения;это то, для чего они.Просто верните фактический результат.

3 голосов
/ 11 января 2012

Вы не можете вернуть более одного целого числа для вашего метода. Что вы можете сделать, это:

  • Создайте новый объект с 2 целочисленными полями и позвольте вашему методу вернуть экземпляр этого объекта (в основном, обертку);

  • Заставить ваш метод возвращать массив из 2 целых чисел (или принять его в качестве параметра);

  • Заставьте ваш метод возвращать строковую переменную вида <int 1>,<int 2>. Затем вы можете использовать split () , чтобы получить числа из строки и разобрать их обратно в целые числа.

  • Заставьте ваш метод вызвать исключение и вернуть число.

2 голосов
/ 11 января 2012

Вы правы, что вам нужно будет обернуть значения.Если вызов method не будет слишком частым, подумайте о том, чтобы вызвать исключение, чтобы сообщить о сбое, и в противном случае завершите работу корректно.Это был бы самый Java-esque подход.Я также использую этот шаблон в своем коде C ++ (мне не нравятся выходные параметры и возвращаемые значения в одном и том же методе, если нет других требований, требующих его).

Однако для производительности иногда требуется больше C-systemстиль вызова, который вы используете.В этом случае я рекомендую вам создать тип Result и тип Error, в котором вы можете установить значение.

Еще один вопрос, который необходимо учитывать, - это иметь общий (читаемый "шаблонный") класс с именем TwoTuple<TYPE1, TYPE2>,можно использовать для передачи пар значений вокруг.Я обнаружил, что в Java я много прохожу, хотя это может быть производным от моего личного стиля.:)

1 голос
/ 11 января 2012

Существует два способа обработки сценария: - 1. иметь специальные значения для кодов ошибок, чтобы отличать их от значений результата (если это возможно).Например, метод indexOf () в Java ArrayList возвращает -1, если элемент отсутствует в списке, в противном случае возвращает положительный индекс.2. Используйте исключения для ошибочных условий и всегда рассматривайте возвращаемое значение как правильный результат.То есть, если метод возвращается без каких-либо исключений, примите код выхода равным 0 и сохраните возвращаемое значение в результате.

Создание пользовательского объекта для хранения результата и кода выхода может быть избыточным.

1 голос
/ 11 января 2012

Я бы предложил создать пользовательский объект для хранения обеих частей данных, например,

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);
}

В качестве альтернативы, как предлагали другие ответы, используйтеИсключения означают, что произошла ошибка, и если метод возвращает результат, вы всегда можете быть уверены, что он действителен.Перехват исключения означает, что произошла ошибка, и вы можете обработать ее так же, как если бы вы обрабатывали errorCode.

0 голосов
/ 11 января 2012

Во-первых, код ошибки int?Обычно считается плохим в Java.Исключение обычное (но медленное при исполнении).Если это на самом деле обычное явление и / или производительность критична, верните что-то значимое.Возможно, неплохое новое перечисление [2004].

Итак, в общем, как вернуть несколько значений.Вы можете взломать его и использовать AtomicInteger или подобное.Пожалуйста, не используйте массив!

Лучше было бы вернуть значимый (возможно, неизменный) объект.Pair<,> не является значимым объектом.(В будущей версии языка было несколько предложений по упрощению этого.)

Более экзотическим способом является передача объекта обратного вызова.это особенно полезно, если данные результата отличаются в зависимости от возможных типов результатов.Пусть метод вернет void (или, возможно, результат обратного вызова) и добавит параметр.Вызовите метод в зависимости от типа результата.Добавьте столько аргументов (в пределах вкуса) и методов, сколько полезно.Типичный вызывающий объект использует анонимный внутренний класс и не должен включать код ошибки.Конечно, возвращение к включающему методу снова поднимает проблему получения данных.

0 голосов
/ 11 января 2012

В библиотеке Apache Commons есть компонент MutableInt . Поскольку он изменчив, вы можете передать его по ссылке.

0 голосов
/ 11 января 2012

Возвращает объект, содержащий два целых числа, например.используя commons-lang v3 Pair

Pair<Integer, Integer> method(){
   return Pair.of(a,b)
}
0 голосов
/ 11 января 2012

В вашем случае, если у вас есть ошибка, выведите соответствующее исключение.У вас также есть исключения в C ++.

Все остальное является допустимым результатом.


Однако, чтобы ответить на ваш вопрос о том, как вернуть несколько значений.

Подход Iво многих местах используется интерфейс слушателя

 interface ErrorOrResult {
    void onError(int error);
    void onResult(int result);
 }

 a.method(errorOrResultImpl); // can use an anonymous implementation here.

Как видите, различные типы результатов можно вызывать любое количество раз с различными аргументами.


Вы можете вернуть объект с двумя полями.Это наиболее ориентированный на объект способ.

Если вас беспокоит, что объект создается каждый раз, вы можете передать объект в качестве аргумента.Самым простым из них является int[], который вы повторно используете.

 int[] results = { 0, 0 };

 a.method(results);

Альтернативой является возврат long.

 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;

Учитывая, что существует слишком много альтернатив, может пройти некоторое время, прежде чем допустимы множественные возвращаемые значения.

0 голосов
/ 11 января 2012

Возвращение кода ошибки не является хорошей практикой в ​​Java.Вместо этого используйте исключения ... И список для нескольких значений ...

List<Integer> method(Parameter... paramteters)
{
   List<Integer> listOfValues = ...

   //some calculations

   if(errorCondition) throw new SomeException();

   //more calculations, if needed       

   return listOfValues;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...