How to return multiple objects from a Java method?
Как вернуть несколько объектов из метода Java?
Я хочу вернуть два объекта из метода Java, и мне было интересно, какой может быть хороший способ сделать это?
Возможные способы, о которых я могу подумать, следующие: вернуть HashMap (поскольку два объекта связаны) или вернуть ArrayList из Object объектов.
Чтобы быть более точным, два объекта, которые я хочу вернуть, - это (a) List объектов и (b) одинаковые имена, разделенные запятыми.
Я хочу вернуть эти два объекта из одного метода, потому что я не хочу перебирать список объектов, чтобы получить имена, разделенные запятыми (что я могу сделать в том же цикле в этом методе).
Почему-то возврат a HashMap выглядит не очень элегантным способом сделать это.
Переведено автоматически
Ответ 1
Если вы хотите вернуть два объекта, вы обычно хотите вернуть один объект, который инкапсулирует эти два объекта.
Вы могли бы вернуть список NamedObject объектов, подобных этому:
publicclassNamedObject<T> { publicfinal String name; publicfinal T object;
Тогда вы можете легко вернуть List<NamedObject<WhateverTypeYouWant>>.
Также: почему вы хотите возвращать список имен, разделенных запятыми, вместо List<String>? Или, еще лучше, верните a Map<String,TheObjectType> с ключами, представляющими собой имена и значения объектов (если только ваши объекты не имеют указанного порядка, и в этом случае a NavigableMap может быть тем, что вы хотите.
Ответ 2
Если вы знаете, что собираетесь вернуть два объекта, вы также можете использовать общую пару:
publicclassPair<A,B> { publicfinal A a; publicfinal B b;
publicPair(A a, B b) { this.a = a; this.b = b; } };
Отредактируйте более полно сформированную реализацию вышеизложенного:
if (pair.isInstance(pClass, qClass)) { return (Pair<P, Q>) pair; }
thrownewClassCastException();
}
}
Примечания, в основном касающиеся проблем с Java и generics:
оба a и b являются неизменяемыми.
makePair статический метод помогает вам с набором текста, который оператор diamond в Java 7 сделает менее раздражающим. Есть некоторая работа, чтобы сделать этот re: generics действительно приятным, но теперь все должно быть в порядке. (c.f. PECS)
hashcode и equals генерируются eclipse.
приведение во время компиляции в cast методе в порядке, но кажется не совсем правильным.
Я не уверен, нужны ли подстановочные знаки в isInstance.
Я только что написал это в ответ на комментарии, только для иллюстрации.
Ответ 3
В случае, если вызываемый вами метод является частным или вызывается из одного места, попробуйте
returnnewObject[]{value1, value2};
Вызывающий объект выглядит следующим образом:
Object[] temp=myMethod(parameters); Type1 value1=(Type1)temp[0]; //For code clarity: temp[0] is not descriptive Type2 value2=(Type2)temp[1];
Пример пары Дэвида Ханака не имеет синтаксических преимуществ и ограничен двумя значениями.
returnnewPair<Type1,Type2>(value1, value2);
И вызывающий объект выглядит следующим образом:
Pair<Type1, Type2> temp=myMethod(parameters); Type1 value1=temp.a; //For code clarity: temp.a is not descriptive Type2 value2=temp.b;
Ответ 4
Вы можете использовать любой из следующих способов: