Это скорее логический вопрос, чем конкретный код, у меня есть около двадцати функций, каждая функция вычисляет два значения моего интереса. Однако я могу только вернуть одно значение из функции. Теперь у меня есть другой способ: создать класс и реализовать сеттер и getter с глобальными переменными. Я хочу знать, насколько это целесообразно и рекомендуется? Или есть лучший способ сделать это?Как вернуть несколько значений из функции.
ответ
Не используйте глобальные переменные! Используйте некоторый класс, который имеет ваши данные как частные файлы, и предоставляет для него геттеры. Как в
class Pair<A,B> {
final A one;
final B two;
public Pair(A fst, B snd) { one = fst; two = snd; }
public A getFst() { return one; }
public B getSnd() { return two; }
}
Тогда вы можете в другом месте что-то вроде:
return new Pair(42, "a result");
Верните Collection
из вашей функции, содержащей ваши ценности.
список Массив вы имеете в виду? Таким образом, мне не нужно разбить его на два класса. Хотя я мог бы задуматься о безопасности типов. – User3
Зависит от того, что вы намерены вернуть. Если они являются уникальным значением, вы можете использовать Set или если они являются ключевыми, вы можете использовать Map. –
Вы должны вернуть List
или array
.
Но если return
разных размеров, вы можете создать собственный класс и использовать его как возвращаемый тип.
Пример
public class Result {
private String name;
private int age;
// getters and setters;
}
Теперь вы можете иметь некоторые вещи, как следующий
public static Result getInfo(){
Result result=new Result();
result.setName("name");
result.setAge(10);
return result;//now you can have String and int values return from the method
}
Я думаю, что в моем случае предпочтительнее второй вариант, мои типы данных очень разнообразны, а разница в плавающей запятой может вызвать у меня проблемы. – User3
В зависимости от проблемы. Но 2 решения:
- Сделайте новый класс, экземпляры которого будут возвращены всеми этими функциями. У этого класса было бы 2 атрибута для каждого необходимого ответа.
- Возвращаемый массив или коллекция с этими 2 ответами.
Вы можете даже вернуть значения, разделенные специальным символом, сказать «~», если вы уверены, что «~» не будет отображаться в ваших результатах.
Уродливый хак - возможно, COBOL представил записи более полувека назад! –
Вы можете сделать это
long[] function() {
long[] ret = { a, b };
return ret;
}
или
long[] a = { 0 }, b = { 0 };
void function(long[] a, long[] b) {
a[0] = ...
b[0] = ...
или добавить свойства к объекту.
private long a,b;
void function() {
a = ...
b = ...
}
в последнем случае вы можете оценить.
class Results {
public final long a;
public final Date b; // note: Date is not immutable.
// add constructor
}
public Results function() {
long a = ...
Date b = ...
return new Results(a, b);
}
Тип безопасности - проблема. – User3
@ user2822178 Каковы ваши расчетные типы? –
Я хотел бы отказать против # 2, т. Е. Повлиять на состояние объекта. Конечно, это может быть уместно в определенных контекстах, но в целом его, вероятно, следует избегать. – Smallhacker
Я думаю, что делает запись класс является наиболее подходящим.
public class Record {
public final int a;
public final int b;
public Record(final int a, final int b) {
this.a = a;
this.b = b;
}
}
Тогда ваши функции могут возвращать тип Record
, и вы можете получить к нему доступ, скажем record.a
и record.b
.
Это также один из немногих случаев, когда переменные public
и никакие геттеры и сеттеры не могут быть оправданы.
UPDATE: Реализован предложенное изменение, теперь все final
, что означает, что Record
не может быть изменен, когда вы получите его обратно, что, кажется, в соответствии с ожиданиями. Вы только хотите результаты и использовать их.
Я бы избегал конструктора no-arg и делал поля 'final', но в противном случае пользовательская запись является самым чистым решением ... –
@GyroGearless Правда, исправлено это, это действительно так, если все, что вам нужно, это иметь два возвращаемые значения. – skiwi
Существует множество способов: коллекции, массивы ... На мой взгляд, единственный способ - определить класс с этими значениями. вам не нужны методы получения и установки, если вам не нужно регулировать видимость содержимого
class MyReturnValue {
public int a;
public int b;
}
в вашем коде:
...
MyReturnValue result=new MyReturnValue();
result.a=5;
result.b=6;
return result;
Лучше сделать класс и реализовать сеттер и getter с глобальными переменными, а не с возвратом коллекции, это зависит от вашего использования.
насчет принятия varargs
с общей вспомогательной функцией для получения вокруг числа возвращения переменного ограничения: В этом решении мы не должны объявить новый класс каждый раз, когда число возвращения переменного изменяется.
class Results
{
private final Object[] returnedObj;
public Results(Object... returnedObj)
{
this.returnedObj = returnedObj;
}
public <E> E getResult(int index)
{
return (E)returnedObj[index];
}
}
Тестовый пример:
public static Results Test()
{
return new Results(12, "ABCD EFG", 12.45);
// or return larger number of value
}
//// And then returning the result
Results result = Test();
String x = result.<String>getResult(1);
System.out.println(x); // prints "ABCD EFG"
Отличное решение! – User3
- 1. вернуть несколько значений из функции
- 2. Как вернуть несколько значений из функции JavaScript
- 3. Как вернуть несколько значений из одной функции?
- 4. Не удается вернуть несколько значений из функции
- 5. Как вернуть несколько значений?
- 6. Как вернуть несколько значений
- 7. Как вернуть несколько значений из пользовательской функции C?
- 8. Как вернуть несколько значений из функции объекта javascript?
- 9. QTP: Как я могу вернуть несколько значений из функции
- 10. Как вернуть несколько значений из функции в C# (ASP.NET)?
- 11. Как вернуть несколько значений из функции в C?
- 12. Как я могу вернуть несколько значений из функции GUI MATLAB
- 13. Как вернуть несколько значений из функции в c
- 14. как вернуть несколько значений из пользовательской функции в SQL
- 15. Схема Как вернуть несколько значений?
- 16. Как вернуть несколько значений из несвязанного поиска?
- 17. Как вернуть несколько значений из подзапроса
- 18. Как вернуть несколько значений из запроса vb.net
- 19. как вернуть массив значений из функции Js
- 20. Как вернуть сотни значений из функции C++?
- 21. Как вернуть пару значений ключа из функции
- 22. Попытка вернуть несколько значений
- 23. Prolog: Как вернуть несколько значений?
- 24. вернуть несколько значений из функции обратно к вызову
- 25. Вставить несколько значений и вернуть несколько значений
- 26. Как Python возвращает несколько значений из функции?
- 27. Возможно ли вернуть несколько значений из функции mysql?
- 28. Как вернуть несколько объектов из функции js
- 29. Как вернуть несколько раз из функции?
- 30. вернуть несколько значений из php в jquery
Лучшее предложение для сохранения нескольких типов. + 1 :) – Sage
Пойду с этим. – User3