CodeGym /Java blogg /Slumpmässig /Ternär operatör
John Squirrels
Nivå
San Francisco

Ternär operatör

Publicerad i gruppen
Hej! Dagens lektion blir inte särskilt lång, men den kommer definitivt att vara användbar :) Vi ska prata om den så kallade ternära operatorn . Ternär operatör - 1Ternär betyder " sammansatt av tre delar ". Det är ett alternativ till if-elsekontrollflödesbeskrivningen som du redan har uppfyllt. Låt oss ge ett exempel. Anta att någon bestämde sig för att gå till en R-klassad film (under 17 kräver en medföljande förälder eller vuxen vårdnadshavare). Vaktmästaren kontrollerar sin ålder vid dörren: om han klarade ålderskontrollen får han gå in; om inte skickas han hem. Låt oss deklarera en Personklass och kontrollera detta med ett if-elseuttalande:

public class Person {

   private int age;

   public Person(int age) {
       this.age = age;
   }

   public int getAge() {
       return age;
   }

   public void setAge(int age) {
       this.age = age;
   }

   public static void main(String[] args) {

       Person person = new Person(22);

       String usherResponse;

       if (person.getAge() >= 18) {
           usherResponse = "Everything is in order. Come in!";
       } else {
           usherResponse = "This film is not suitable for your age!";
       }

       System.out.println(usherResponse);

   }
}
Konsolutgång:

"Everything is in order. Come in!"
Om vi ​​tar bort konsolutgången ser vår kontroll ut så här:

if (person.getAge() >= 18) {
           usherResponse = "Everything is in order. Come in!";
       } else {
           usherResponse = "This film is not suitable for your age!";
       }
Logiken är väldigt enkel här: ett villkor kontrolleras (ålder >= 18) Baserat på resultatet usherResponsetilldelas variabeln en av två strängar med vaktmästarens svar. Sådana situationer ("ett villkor - två möjliga utfall") är extremt vanliga inom programmering. Och det var därför den ternära operatören skapades. Vi kan använda den för att förenkla vår kontroll till en enda kodrad:

public static void main(String[] args) {

   Person person = new Person(22);

   String usherResponse = (person.getAge() > 18) ? "Everything is in order. Come in!" : "This film is not suitable for your age!";

   System.out.println(usherResponse);

}
Så här fungerar den här operatören. Det kallas den ternära operatorn, eftersom det involverar 3 komponenter:
  • Ett villkor ( person.getAge() > 18)
  • Två möjliga utfall ( "Allt är i sin ordning. Kom in!" och "Den här filmen är inte lämplig för din ålder!" )
Först skriver vi villkoret, följt av ett frågetecken.

person.getAge() > 18 ?
"Är den här personens ålder över 18?" Sedan skriver vi det första värdet . Detta värde används om villkoret utvärderas tilltrue :

String usherResponse = person.getAge() > 18 ? "Everything is in order. Come in!"
Är den här personens ålder över 18? Om ja, ställ in usherResponse variabeln till "Allt är i sin ordning. Kom in!" Därefter kommer :symbolen " " och det andra värdet . Detta värde används om villkoret utvärderas tillfalse :

String usherResponse = person.getAge() > 18 ? "Everything is in order. Come in!" : "This film is not suitable for your age!";
Är den här personens ålder över 18? Om ja, ställ in usherResponse variabeln till "Allt är i sin ordning. Kom in!" . Om inte, ställ in usherResponse variabeln på "Den här filmen är inte lämplig för din ålder!" I allmänhet, så här ser den ternära operatorns logik ut. skick ? utfall 1 : utfall 2 Ternär operatör - 2 Förresten krävs inte parentesen runt villkoret: vi har lagt till dem för bättre läsbarhet. Det fungerar även utan dem:

public static void main(String[] args) {

   Person person = new Person(22);

   String usherResponse = person.getAge() > 18 ? "Everything is in order. Come in!" : "This film is not suitable for your age!";

   System.out.println(usherResponse);

}
Så vad ska du använda? Ett if-elseuttalande eller den ternära operatorn? När det gäller prestanda är det ingen skillnad. Mer exakt, kanske det finns, men det är obetydligt. Den största faktorn här är läsbarheten av din kod. Koden du skriver måste inte bara fungera korrekt, utan också vara lätt att läsa . När allt kommer omkring kan det vara "ärvt" av andra programmerare, dina kollegor! Om det är svårt att förstå kommer det att komplicera deras och ditt arbete (de kommer springande till dig för förklaringar var 5:e minut). Den allmänna rekommendationen är denna: om tillståndet är enkelt och lätt att verifiera, kan du använda den ternära operatören utan skada. Detta låter dig minska mängden kod och antaletif-elseuttalanden (och det kan redan finnas många av dem). Men om tillståndet är komplext och involverar flera steg, är det bättre att använda ett if-elseuttalande. Till exempel skulle det vara en dålig idé att använda en ternär operator i det här fallet:

String usherResponse = (person.getAge() > 18 && (person.hasTicket() || person.hasCoupon()) && !person.hasChild()) ? "Come in!" : "You can't come in!";
Det är inte direkt uppenbart vad som händer här! Koden har blivit väldigt svår att läsa. Och allt på grund av det komplexa tillståndet:
  • Om någon är äldre än 18 år, har biljett (eller frikort) och inga små barn kan han komma in.
  • Om ens en del av tillståndet är falskt, så kan han inte.
Här är det klart bättre att använda if-else. Ja, vår kod kommer att bli större, men den blir mycket mer läsbar. Och dina kollegor kommer inte att möta handflatan om de ärver den här koden :) Äntligen kan jag rekommendera en bra för dig. Vi berörde kodläsbarhet under lektionen. Robert Martins bok "Clean Code", som har blivit en klassiker, är tillägnad detta ämne. Ternär operatör - 4Den samlar bästa praxis och rekommendationer för programmerare, vilket hjälper dig att skriva kod som inte bara är funktionell utan också lätt att läsa.
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION