Vinnaren i pepparkakshustävlingen!
2021-11-04, 23:44
  #1
Medlem
Om man har en metod som ska returnera ett värde beroende på vilket if-villkor som uppfylls i metoden och inget villkor uppfylls, dvs inget returvärde kan skickas, hur bär man sig åt för att få metoden att fungera? Den måste returnera ett värde, finns det en enkel lösning.

Om x = 3 vill jag prompta ett felmeddelande:
Kod:
int x;

public Object testmetod (int x){

this.x = x;

if(x == 1){
return new Object
} else if(x == 2){
return new Object
}
}
Citera
2021-11-05, 00:04
  #2
Medlem
Mysquos avatar
Lite osäker på vad du menar, men jag ser i alla fall tre alternativ:

1: använd exception
if (x==1 || x==2) return new Object();
throw new IllegalValueException("Ogilitigt värde ("+x+")");

2: använd null
return x==1 || x==2 ? new Object() : null;

3: använd Optional
return x==1||x==2 ? return Optional.of(newObject()) : Optional.empty();
Citera
2021-11-05, 00:06
  #3
Medlem
JohannesSnajdares avatar
Det beror ju lite på, om det kan förväntas att x kan vara 3 lite då och då så kanske "return null" funkar?

Kod:
class A {

   public Object testmetod(int x) {

     if(x==1)
        return new Object();

     return null;
   }
}

Om däremot x aldrig förväntas kunna vara något annat än 1 och 2 utan det är en felsituation hade jag kastat en exception istället

Kod:
class B {

   public Object testmetod(int x) {

     if(x==1)
        return new Object();

     throw new IllegalArgumentException("Bad x");
   }
}

Sen finns det en massa andra sätt att lösa det, metoden kan t.ex. returnera ett objekt som innehåller dels en "status" (bool) som talar om "det gick bra" och sen själva "datat" som returnerades.

Edit: tvåa på den.
Citera
2021-11-05, 00:39
  #4
Medlem
Value objects som föreslogs ovan kan vara snyggt.

valObj.HasValue
valObj.Value

Null blir ofta ett problem. Anroparen vet inte om det som returneras kan vara null. Och när du debuggar kod, och får tillbaks null, då vet du inte vad som hände inne i metoden. Det blir mycket enklare i längden om det blir tydligt vilken väg som har körts.

T. ex om du skulle ha en bugg under If 1 som av misstag returnerar null, då har du ingen aning om det är rätt eller fel när du ser att null returnerades, om du har för vana att returnera null på andra ställen.

Ett annat alternativ är output parametrar:
http://www.javapractices.com/topic/TopicAction.do?Id=37

Jag föredrar att returnera value objects och undviker alltid null.
Citera
2021-11-05, 10:17
  #5
Medlem
Bonnatorps avatar
Vad är det för fel på att använda ett helt vanligt else?
Då uppfylls ju villkoret när ingen av de specificerade villkoren uppfylls.
Citera
2023-09-10, 01:22
  #6
Medlem
Citat:
Ursprungligen postat av Bonnatorp
Vad är det för fel på att använda ett helt vanligt else?
Då uppfylls ju villkoret när ingen av de specificerade villkoren uppfylls.
Problemet är väl att det inte kommer kompilera utan returvärde (eller kastat exception). Eller om du undrar varför ovan inte har else I sitt exempel så är det överflödigt om alla tidigare grenar returnerar.
Citera
2023-11-15, 07:16
  #7
Medlem
Du skulle också kunna ha returtyp boolean och returnera true eller false. Som i nedan kod.

Kod:
public boolean testmetod(int x) {
    this.x = x;
    
    switch(x) {
        case 1:
        case 2:
            return true;
        default:
            return false;
    }
}
Citera
2023-11-15, 20:54
  #8
Medlem
Det snyggaste (om inga krav förbjuder det) är att göra ett rekursivt anrop i defaulten. I det fallet tycker jag att det är OK att returnera null då man aldrig kommer att hamna där utan enbart gör det för att släcka varningar i Idén.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback