2012-02-22 4 views
3

У меня есть метод, который анализирует список String записей в объекты и возвращает List объектов. Итак, моя подпись метода такова.Возвращение двух разных значений из метода

public List<ParsedObject> parse(String[] records);

Но я также хочу вернуть другие показатели, такие как количество строковых записей, которые не были успешно проанализированы. Теперь я запутался, как вернуть эту метрику. Один из вариантов заключается в создании другого класса-оболочки, который содержит как список проанализированных записей, так и членов для хранения этих показателей.

Но я очень часто сталкиваюсь с этой ситуацией, и таким образом я бы создал много классов-оболочек.

Не уверен, что я хорошо объяснил. Какие-нибудь предложения здесь?

+0

Вы можете включить другие переменные в класс, в котором этот метод parse() объявлен (если он соответствует концепции ООП) и использовать методы getter для доступа к этим значениям. – JProgrammer

+0

Вы ожидаете разобрать 1 объект на запись? Если это так, вызывающий код может сравнить размер списка с длиной записей. – jlewis42

+0

Это был просто пример, хотя в этом случае он будет работать. – RandomQuestion

ответ

5

К сожалению, Java не поддерживает возврат нескольких значений из функции. Вы можете создать класс-оболочку, как вы сказали. Другой вариант - передать массив целых чисел или объект «метрики» или что-то в этом роде и изменить его внутри Parse. Чуть лучше может быть иметь одну или несколько переменных экземпляра (а не переменные метода), чтобы отслеживать любую необходимую диагностическую информацию.

+1

Быстрый класс-обертка не является большой инвестицией, особенно если вам нужно только в одном файле, и вы можете просто взломать внутренний класс с несколькими строками. –

+0

Я бы сказал, что если это только в одном классе, использование переменных экземпляра для отслеживания информации является более чистым подходом, но, конечно, это разумный подход. Автор специально упомянул, что не хотел создавать много классов-оболочек, поэтому я подумал, что было бы хорошо объяснить альтернативы. –

+2

Использование переменных экземпляра затруднит использование класса поточно-безопасным способом, я бы избегал этого. – ARRG

1

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

0

Класс обертки - стандартный способ возврата дополнительной информации от функции. Другой альтернативой было бы передать другой параметр по ссылке и изменить его в вашей функции, тем самым эффективно возвращая новую информацию вызывающей стороне. Например, в вашем случае вы должны передать пустой список и добавить все проанализированные элементы в этот список. Тип возврата может быть метрикой или кодом ошибки. Таким образом, у вызывающего есть обе части информации.

0

Это очень распространенная проблема для многих людей, которые разрабатывают Java. В других языках, таких как Scala, можно создавать кортежи, которые являются анонимными объектами, которые могут содержать несколько значений, и использовать их в качестве аргументов или возвращаемых значений.

5

Ваш вопрос уже обсуждался (см., Например: Should Java method arguments be used to return multiple values?). Я лично считаю, что вы должны либо сделать два вызова метода, если возвращаемые данные не связаны. Если да, то вы должны создать класс «обертка», как вы его называете. Если они действительно связаны с данными, они, вероятно, все равно принадлежат к одному классу.

Мне лично не нравится изменение, переданное в объектах, потому что для меня это побочный эффект, и не ясно, что он действительно делает.

Другой способ подумать об использовании фабричного шаблона (см. http://en.wikipedia.org/wiki/Factory_method_pattern), если объект, который вы строите, является сложным.

1

Вы можете вернуть сложный объект, содержащий список и всю необходимую информацию.

Смежные вопросы