Article View: pl.comp.lang.java
Article #153994Re: Co gdy funkcja ma zwrócić dwie rzeczy?
From: Arivald
Date: Fri, 14 Mar 2014 08:14
Date: Fri, 14 Mar 2014 08:14
116 lines
4315 bytes
4315 bytes
On 2014-03-14 08:05, Borneq wrote:
> Na przykład TryPop pobierająca ze stosu czy kolejki ma zwrócić:
> - element
> - boolean czy udało się zwrócić, czy też struktura jest pusta
> TryConvert- próbująca konwertować tekst na int czy real
Najprościej, jeśli element nie może być nullem, zwracaj element, jeśli
null to się nie udało.
> W Pascalu obchodzi się to (nie jest to za elegancko) przez parametry
> będące referencjami czy wskaźnikami i zwracające wartość. A w Javie?
Można zasymulować przekazywanie przez referencję, np. tak:
public class ObjectHolder<T> {
public T o;
public ObjectHolder() {
this.o = null;
}
public ObjectHolder(T o) {
this.o = o;
}
}
i użycie
ObjectHolder<Data> dataRef = new ObjectHolder<Data>();
if (someFunction(param1, param2, dataRef)) {
do something(dataRef.o);
}
Ale to mało eleganckie, używam tylko w testach, kiedy nie chce mi się
pisać specjalnych klas tylko do tego.
W rzeczywistym kodzie, możliwe rozwiązania:
1) Zwracasz Pair<T1, T2>, jeśli jest w bibliotece lub sobie dopisałeś.
Android ma tą klasę. Jest równie prosta, kod na końcu posta.
2) Budujesz osobną, specjalizowaną klasę wyniku, POJO tyko z polami
final, i ją zwracasz z funkcji.
Taką klasę zresztą można przekazywać poprzez parametr, wtefy wynik wyn
kcji możesz użyć do zwrócenia boolean (udało się) lub kodu błędu
(chociaż to lepiej się wyjątkami robi)
3) Budujesz osobną klasę realizującą tą funkcję, z której potem wyniki
pobierasz getterami
Coś jak:
Calculation calc = new Calculation(param1, param2, param 3);
if (calc.getSuccess()) {
something = calc.getResult1();
other= calc.getResult2();
}
Może "Calulation" to nie najlepsza nazwa, ten konstrukt nadaje się do
wywołań RPC / WebService, etc.
4) a jak nie przeszkadza Ci brak silnego typowania, zwróć kolekcję
obiektów, np ArrayList - dostęp po indexie, lub HashMap - dostęp po
kluczu. Ale takie programowanie może prowadzić do trudnych do
debugowania błędów.
Implementacja immutable Pair, którą można używać w HashMapie (ma
hashCode i equals).
public class Pair<A, B> {
public final A first;
public final B second;
public Pair(A first, B second) {
super();
this.first = first;
this.second = second;
}
public static <A, B> Pair <A, B> create(A a, B b) {
return new Pair<A, B>(a, b);
}
public int hashCode() {
int result = 17;
if (first != null) result = 31 * result + first.hashCode();
if (result != null) result = 31 * result + second.hashCode();
return result;
}
public boolean equals(Object other) {
if (other instanceof Pair) {
Pair otherPair = (Pair) other;
return (
(this.first == otherPair.first || (this.first != null &&
otherPair.first != null && this.first.equals(otherPair.first)))
&&
(this.second == otherPair.second ||(this.second != null &&
otherPair.second != null && this.second.equals(otherPair.second)))
);
}
return false;
}
public String toString() {
return "(" + first + ", " + second + ")";
}
}
--
Arivald
Technical Details
Message-ID:
<lfudon$oc4$1@news.dialog.net.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!news.nask.pl!news.nask.org.pl!newsfeed.pionier.net.pl!news.dialog.net.pl!not-for-mailReferences:
<lfu9op$jdm$1@node1.news.atman.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!news.nask.pl!news.nask.org.pl!newsfeed.pionier.net.pl!news.dialog.net.pl!not-for-mail From: Arivald <NOSPAMarivald@interia.pl> Newsgroups: pl.comp.lang.java Subject: Re: Co gdy funkcja ma zwrócić dwie rzeczy? Date: Fri, 14 Mar 2014 09:14:04 +0100 Organization: Dialog Net Lines: 117 Message-ID: <lfudon$oc4$1@news.dialog.net.pl> References: <lfu9op$jdm$1@node1.news.atman.pl> NNTP-Posting-Host: dynamic-78-8-241-195.ssp.dialog.net.pl Mime-Version: 1.0 X-Trace: news.dialog.net.pl 1394784855 24964 78.8.241.195 (14 Mar 2014 08:14:15 GMT) X-Complaints-To: abuse@dialog.net.pl NNTP-Posting-Date: Fri, 14 Mar 2014 08:14:15 +0000 (UTC) User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Thunderbird/28.0 In-Reply-To: <lfu9op$jdm$1@node1.news.atman.pl> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit