Függvény kétféle visszatérési értékkel?

0 értékelés
60 megtekintés
BFrici (12 pont) kérdezte Nov 2.
Lehetséges olyan, hogy egy függvény nem csak 1 visszatérési értékkel térhet vissza?
Értem itt azt, hogy pl visszaad egy false boolean-t vagy egy Stringet a függvényben lévő feltételektől függően?

2 Válasz

0 értékelés
tkiss Szakértő (308 pont) válaszolta meg Nov 3.
Krisz kiválasztva Nov 9.
 
Legjobb válasz

Szia!
Itt lehet jó lenne kicsit pontosabban tudni, hogy mi a konkrét eset. Amennyiben a boolean csak a false értéket veheti fel, és azt kívánod vele jelezni a hívó metódusnak, hogy az adott string nem tudott előállni, úgy Krisz javaslata korrekt és mehet vissza null, hiszen akkor felesleges boolean-al jelezni azt. Bár ha 8-as vagy újabb java-t használsz, és tudod hogy lehet null a visszatérési érték, akkor Optional használatával még egyértelműbbé teheted:

    public void hivoMetodus()
    {
        Optional<String> optionalText=getValueOptional(15);
        optionalText.ifPresent(s->System.out.println("The returned text:"+s));
    }

    private Optional<String> getValueOptional(int number)
    {
        return Optional.ofNullable(number<10?null:"text");
    }

Ha egy feltétel függvényében többféle visszatérési érték keletkezhet(mondjuk x feltétel teljesülése esetén A típusú objektum keletkezik, különben B), úgy érdemes megvizsgálni, hogy a feltétel kiemelhető -e a hívó metódusba, és maga a hívott metódus két metódusra bontható -e, amik közül az egyikben keletkezhet A, a másikban B. Így a két metódusnál már egyértelmű lesz, hogy mit ad vissza.

Ha mindenképp azt szeretnéd, hogy többféle objektummal térhessen vissza a metódusod, 

  • visszaadhatsz Object-et, de akkor a hívó metódusban még ellenőrizned kell instanceof-al a visszaadott objektum típusát, majd pedig cast-olni arra:
    public void hivoMetodus()
    {
        Object response=getValueObject(1);

        if(response instanceof Boolean) {
            Boolean b=(Boolean)response;            
        }
        else if(response instanceof String)
        {
            String s=(String)response;
        }
        else
        {
            throw new RuntimeException("Invalid response type!");
        }
    }
    
    private Object getValueObject(int number)
    {
        if(number%2==0) {
            return true;
        }       
        return "text";
    }
  • Írhatsz generikus metódust is, és úgy a cast-olás is elkerülhető, de csak abban az esetben, ha előre pontosan tudod, hogy milyen esetben milyen típusa lesz a visszatérési értéknek még mielőtt egy lokális változóhoz rendelnéd, máskülönben kapsz egy ClassCastException-t(persze ilyen esetben is opció az instanceof-al ellenőrzés és cast-olás, de akkor ennyi erővel lehet object is a visszatérési érték) :
    public void hivoMetodus()
    {
        Boolean b=getValueGeneric(2);
        String s=getValueGeneric(1);
    }
    
    private <T> T getValueGeneric(int number)
    {
        if(number%2==0) {
            return (T)Boolean.TRUE;
        }  
        return (T)"text";
    }
  • Opció még egy wrapper response objektum, amibe egyik, másik, vagy mindkét objektumot beállíthatod.
Üdv.: Tamás
0 értékelés
Krisz Guru (1,960 pont) válaszolta meg Nov 2.
Javaban egy fuggvenynek csak egyetlen visszateresi erteke lehet. Visszaadhatsz viszont egy Map-et, ami key-value parokat tarol. A key lehet egy String akar, amig az erteke lehet egy boolean.

 De lehet, hogy a te esetedben erdemesebb inkabb egy null erteku Stringet visszakuldeni akkor, amikor false-t kuldenel vissza. Helyzettol fuggoen erdemes atgondolni melyik a jobb.
...