Mam dość duże doświadczenie w C# i w C++, niewielkie w Java. W dwóch pierwszych językach zdarza się, ze tworzę funkcję, która jednocześnie generuje dwa wyniki. Trochę bez sensu pisać dwie takie same funkcje lub dodawać dodatkowy parametr, który określa, którą wartość funkcji zwrócić, co też wiązałoby się z wielokrotnym wywołaniem funkcji.
Taki trywialny przykład, w praktyce bez sensu, ale na potrzeby tematu myślę, że jest OK. Funkcja, która przyjmuje dwie liczby i oddaje inne dwie liczby:
W C# byłoby tak:
void JakasFunkcja(int Dana1, int Data2, out int Wynik1, out int Wynik2)
{
Wynik1 = Dana1 + Dana2;
Wynik2 = Dana1 * Dana2;
}
W C++ byłoby tak:
void JakasFunkcja(int Dana1, int Data2, int &Wynik1, int &Wynik2)
{
Wynik1 = Dana1 + Dana2;
Wynik2 = Dana1 * Dana2;
}
AFAIK, analogiczny sposób w Java nie jest możliwy. Przykład jest może i "z czapy", ale załóżmy, że nie jest możliwe wykonanie samego dodawania, ani samego mnożenia. W jaki sposób w programiście Java zazwyczaj wyprowadzają z funkcji więcej niż jedną wartość?
Gdzieś czytałem w internecie, że można zrobić tablicę:
object[] JakasFunkcja(int Dana1, int Data2)
{
object[] Wynik = new object[2];
Wynik[0] = Dana1 + Dana2;
Wynik[1] = Dana1 * Dana2;
return Wynik;
}
Tworzyć nowy obiekt tylko po to, żeby wyciągnąć kilka liczb to chyba trochę bez sensu.
Inny pomysł, to ze zmiennymi globalnymi:
int JakasFunkcja_Wynik1;
int JakasFunkcja_Wynik2;
void JakasFunkcja(int Dana1, int Data2)
{
JakasFunkcja_Wynik1 = Dana1 + Dana2;
JakasFunkcja_Wynik2 = Dana1 * Dana2;
}
Teoretycznie ma to sens, o ile w danym programie nie ma możliwości, żeby tą funkcję uruchamiały dwa różne wątki, przy wielokrotnym wywołaniu w różnych wątkach z całą pewnością będzie problem z poprawnością wyników.
Mam przeczucie, że niejeden programista Java skrytykuje taki sposób wyprowadzania wyniku, mimo, że ma on sens, będzie działać w projekcie jednowątkowym (w wielowątkowym również, ale tylko w przypadku, gdy możliwe jest tylko jedno wywołanie funkcji naraz) i nie tworzy dodatkowych obiektów bez potrzeby.
W związku z powyższym jest pytanie ode mnie, czy programiści stosują jeden z dwóch wyżej wymienionych sposobów, czy jeszcze inaczej to robią?
Chodzi o to, że jak pisałem program w C# nie myśląc o Java, a nagle z jakiegoś powodu chcę przerobić program na Java, to jak to najprościej ogarnąć?