Как вернуть два значения (1.Collection, 2.Single Boolean value) из метода в Java с меньшими затратами? - PullRequest
2 голосов
/ 31 мая 2011

У меня есть один основной класс и класс VOCollection. в основном классе есть метод getStatus (), только из этого метода я получаю некоторый статус (true, false), если статус true, мне нужно вернуть коллекцию. в настоящее время у меня есть две идеи, но обе стоят дорого.

  1. возврат карты, это дорого, потому что установка логического значения для коллекции создает путаницу в коде, и достаточно только одного логического значения (но мы возвращаем несколько).

  2. создание переменной экземпляра в классе VOCollection и наличие getter & setter для получения и установки логического значения. это тоже дорого. (создание переменной в другом классе).

дай мне менее дорогое решение.

Ответы [ 6 ]

5 голосов
/ 31 мая 2011

Есть несколько способов сделать это:

  • Вернуть ноль, чтобы указать, что нет ничего похожего на java.util.Map.get ()
  • Создать пользовательскийкласс для возврата обоих параметров.(См. Другой ответ)
  • Используйте массив из 1 элемента для одного из возвращаемых значений.логический метод (List [] result) {result [0] = answer;флаг возврата;}
  • Используйте такую ​​библиотеку, как Google Guava, в которой есть класс Pair / Tuple: метод Pair () {return new Pair (flag, answer);}
  • Измените свой код так, чтобы он не требовался, обычно это правильный ответ.См. Комментарий об исключении или измените способ передачи данных.
4 голосов
/ 31 мая 2011

Желание вернуть объект или логическое значение вонючее. Этот тип «флага» очень часто встречается в коде начинающих, которые не совсем понимают, как обрабатывать исключительные или «ничего» результаты.

Если логическое значение представляет исключение, просто отпустите его или перебросьте в другом исключении. Например. IllegalArgumentException, IllegalStateException, UnsupportedOperationException и т. Д. В зависимости от функциональных требований. Вы можете поместить вызывающий код в try-catch и обработать его соответствующим образом.

Или, если логическое значение представляет состояние «ничего», просто верните null или пустую коллекцию. Вы можете справиться с этим, протестировав возвращаемое значение после вызова метода.

3 голосов
/ 31 мая 2011

Вы можете ввести класс, подобный этому

class StatusResult
{
    public final bool status;
    public final VOCollection result;

    ...
}

и изменить подпись getStatus() на

StatusResult getStatus()
1 голос
/ 31 мая 2011

Просто верните коллекцию, когда «статус истинен». В противном случае верните ноль.

Но: Получение коллекции с вызовом метода с именем getStatus () - это не то, что я ожидал.

"getStatus ()" звучит, получая некоторое постоянное значение, указывающее внутреннее состояние. (например, константа перечисления, код состояния int)

В вашем сценарии я бы порекомендовал иметь один метод, возвращающий логическое значение, указывающее, что «у меня есть что-то или нет», и другой метод, возвращающий коллекцию - это то, что у вас есть или равно нулю, когда его нет. Затем можно легко реализовать булев метод, вызвав проверку метода коллекции! = Null.

public boolean isXyz() {
    return getXyz() != null;
}

public Collection getXyz() {
    return yourCollection; //maybe null
}
1 голос
/ 31 мая 2011

Я сталкивался с такой же ситуацией в моем прошлом.

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

На самом деле Java не поддерживает множественные возвращаемые значения из метода.

Решение, которое я реализовал, было

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

В вашем случае я бы выбрал следующий путь Создайте строку наподобие returnValue, пусть эта строка начинается с 0 или 1, если ее 1 равно true, иначе false. и добавьте второе возвращаемое значение к этому.

Например, вы пытаетесь вернуть как «returnValue1» и «true» для истинного давайте оставим это 1, а для ложного давайте оставим это 2 когда вы сделаете это, ваше возвращаемое значение станет "1returnValue1"

0 голосов
/ 31 мая 2011

Самый простой подход - всегда возвращать коллекцию VOCollection. Для ситуации, когда данных нет, вы можете вернуть коллекцию без данных, т. Е. IsEmpty () true, или коллекцию с флагом (но я предпочитаю первый вариант).

Чтобы избежать создания объекта каждый раз, создайте один экземпляр неизменяемой коллекции VOCollection без записей. Это то, что вы можете вернуть, когда у вас нет данных.

...