Java - Ternary Operator Nedir?

LifeMCServer

Nether Yerlisi
Mesajlar
2,410
En iyi cevaplar
98
Beğeniler
2,461
Puanları
10,250
Ruh hali
Java - Ternary Operator Nedir?
Ternary operator, bir koşul ifadesidir ve bir sonuç döndürür.
Kısaca kendisi if else'nin kısayolu gibidir.


Ternary Operator Formatı
booleanExpression ? expression1 : expression2

İlk kısım, bir boolean veya boolean döndüren bir methodun sonucu olmak zorunda. Boolean true ise soru işaretinden sonraki ilk kısım döndürülecek, false ise de ikinci kısım döndürülecektir.


Ternary Operator Örneği

Ternary operatorsüz kod:
Java:
final int num = 8;
String msg = null;

if (num > 10)
    msg = "Sayı 10'dan yüksek";
else
    msg = "Sayı 10 veya daha düşük bir sayı";


Ternary operatürlü kod:
Java:
final int num = 8;
final String msg = num > 10 ? "Sayı 10'dan yüksek" : "Sayı 10 veya daha düşük bir sayı";


Bu kod num değişkeninde barınan sayı eğer 10'dan yüksek ise msg değişkenini Sayı 10'dan yüksek yazısına eşitliyor, eğer 10 veya daha düşük bir sayı ise de Sayı 10 veya daha düşük bir sayı yapıyor.

İkinci kodun daha kısa olduğunu ve değişkeni null yapmadan direkt aynı satırda belirleyip final kullanabildiğimizi farketmişsinizdir. İşte bu tür yerlerde ternary operator dediğimiz özelliği kullanmamız bizim avantajımıza oluyor.

Ternary özelliğine girdiğiniz iki ihtimalden koşul baz alınarak sadece birisi seçilir, yürütülür ve sonucu döndürülür. Tıpkı ifteki gibi. Diğer kısım yürütülmeyeceğinden sonuç hesaplanmaz, bunun için bir JUnit testi:


Java:
@Test
public void whenConditionIsTrue_thenOnlyExpression1IsEvaluated() {
    final int exp1 = 0, exp2 = 0;
    final int result = 12 > 10 ? ++exp1 : ++exp2;

    assertThat(exp1).isEqualTo(1);
    assertThat(result).isEqualTo(1);
    assertThat(exp2).isEqualTo(0);
}


Bu kodda, 12 sayısı 10 sayısından büyük olduğu için ilk koşul gerçekleşecektir. İlk koşul exp1 değişkenini bir arttıracak ve bu işlemin sonucunu result değişkenine atayacaktır. Bu durumda exp1 ve result 1 olurken, exp2 değişkeni değişmeyecek yani 0 kalacaktır.

Ternary Return
Ternary operatorünü return ile birlikte de kullanabilirsiniz. Mesela, örnek olarak diyelim ki Bukkit üzerinde bir CommandSender'ın istenen yetkiye sahip olup olmadığını kontrol etmek için method yaptınız diyelim.

Fakat bu methodu tek satırda tutmak ve eğer CommandSender konsol ise, veya oyuncu olup operator (OP) ise, veyahut * yetkisine sahip ise, istenen spesifik yetkiye sahip olmasa bile true döndürmek istiyorsunuz.

İşte bunun için örnek bir kod:


Java:
public static final boolean hasPermission(final CommandSender sender,
                                          final String permission) {
    return sender instanceof ConsoleCommandSender ||
           sender.isOp() ||
           sender.hasPermission("*") ||
           sender.hasPermission(permission) ? true : false;
}

Evet, bu bir ternary return örneği. Fakat bir şey farkettiniz mi? Sonuç boolean olduğu için, yukarıda ternary operator yerine direk koşulu döndürebiliriz. Yani ? true : false kısmı bu durumda gereksiz oluyor.

Böylece tek örnekte hem ternary return'ı hemde redundant ternary operator'ü göstermiş oldum.


Ternary Constructor Super Inovacation
Bir obje oluştrucusunda, extendlenen classdaki oluşturucuyu çağıracaksanız, fakat oluşturucuya girilen parametrelere göre extendlenen classdaki oluşturucuya verdiğiniz parametreleri değiştirmek istiyorsunuz diyelim.

Java:
public class User {
    private final int id;
    private final String username;

    public User(final int id,
                final String username) {
        this.id = id;
        this.username = username;
    }

    public int getId() { return id; }
    public String getUserName() { return username; }
}

public class Member extends User {
    public Member(final User user,
                  final String nickname) {
        super(nickname == null ? user.getUserName() : nickname);          
    }
}

Şuanda aklıma başka örnek gelmediği için biraz gereksiz bir örnek verdim, fakat mesela burada ternary operator kullanmayıp if else kullansaydık, super'den öncesine koymamız gerekeceğinden ve Java'da bir oluşturucuda ilk iş extendlediğimiz classın oluşturucusunu çağırma zorunluluğu olduğundan, hata verecekti, fakat ternary operator kullandığımız için vermiyor.

Nested Ternary Operator
İki ternary operatürünü birleştirmekte mümkün, fakat okunabilirliği azalttığı için pek önermem.

Java:
final int num = 8;
final String msg = num > 10 ? "Sayı 10'dan yüksek" : num == 10 ? "Sayı 10'a eşit" : "Sayı 10'dan düşük";

Okunabilirliği arttırmak için parantez içine alabilirsiniz.

Java:
final int num = 8;
final String = num > 10 ? "Sayı 10'dan yüksek" : (num == 10 ? "Sayı 10'a eşit" : "Sayı 10'dan düşük");

Fakat yine de fazla okunabilir olmadığından iç içe ternary operator kullanımı önerilmemekte.

143054


İlginizi Çekebilecek Diğer Konularım

VPS, VDS, Dedicated, vCPU, vRAM ve Trafik Nedir?

Minecraft Sunucu Başlatma Dosyası | Türkçe Karakter Destekli, Optimizeli! 2.0.4-BETA
Windows üzerinde Linux kullanmak (Windows 10)

İşlemci Seçerken Nelere Dikkat Edilmeli?
Minecraft 1.14 Sunucular İçin Eklenti Önerileri [Survival]


Tüm Konularım
 


LifeMCServer

Nether Yerlisi
Mesajlar
2,410
En iyi cevaplar
98
Beğeniler
2,461
Puanları
10,250
Ruh hali
Member fln kodu çalışıyo mu .s

Onu örneklemek için aklıma bir şey gelmediğinden ilk aklıma gelen o tarz bir şey yaptım, fakat normalde super'i çağırmadan önce if else koyulduğunda hata veriyor, ternary kullanırsak hata vermiyor, bundan bahsetmiştim.
 

Erbatur

Gözlerimin içindeki ülkemsin sen benim.
Mesajlar
334
En iyi cevaplar
0
Beğeniler
278
Puanları
810
Ruh hali
Benim anlamadığım bir konu o yüzden içerik hakkında yorum yapmak istemiyorum ama konu harika olmamış mı?
 

Üst