🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.java
Article #153994

Re: Co gdy funkcja ma zwrócić dwie rzeczy?

#153994
From: Arivald
Date: Fri, 14 Mar 2014 08:14
116 lines
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-mail
References: <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