Java'da üçlü operatör vs if/else&; lt JDK8 içinde uyumluluk
Son Bahar Çerçeve kaynak kodunu okuyorum. Burada bir şeyler gidiyor anlayamıyorum:
public Member getMember() {
// NOTE: no ternary expression to retain JDK <8 compatibility even when using
// the JDK 8 compiler (potentially selecting java.lang.reflect.Executable
// as common type, with that new base class not available on older JDKs)
if (this.method != null) {
return this.method;
}
else {
return this.constructor;
}
}
Bu yöntem Sınıf org.springframework.core.MethodParameter
üyesidir. Kodu kolay yorum zor olsa anlamaktır.
NOT: üçlü ifade için korumak olduğunu GÖRDÜM <8 uyumluluğu bile kullanırken GÖRDÜM 8 derleyici (potansiyel olarak seçilmesi
java.lang.reflect.Executable
gibi ortak tür, bu yeni temel sınıf kullanılamaz eski JDKs)
Üçlü ifade kullanarak ve kullanmak arasındaki fark if...else...
Bu bağlamda yapı nedir?
CEVAP
İşlenen türü hakkında düşündüğümüz zaman, bu sorun daha belirgin hale gelir:
this.method != null ? this.method : this.constructor
tip olarak hem işlenen en özel yaygın türü, yani en özel türü this.method
this.constructor
Her iki ortak.
Bu 18 ** ancak Java 7 Java 8 sınıf kitaplığı Member
genel daha özel olan 19* *yeni bir türü tanıttı. Dolayısıyla Java 8 sınıf kitaplığı ile sonucu üçlü ifadenin türü Executable
Member
yerine.
Java 8 derleyici (ön sürüm) sürümleri üçlü operatör derleme oluşturulan kod içinde Executable
açık bir başvuru üretilmiş gibi görünüyor. Bu sınıf, bir yük yaratacağı ve bir sınıf kitaplığı < Executable
8, komple cam ile çalışan varsa çalışma zamanında ClassNotFoundException
≥ 8 olduğunu GÖRDÜM böylece.
Belirtildiği gibi tarafından Tagir Valeev this answer, Bu aslında bir hata yayım öncesi sürümleri ile İLGİLENİYORUZ 8 ve beri sabit, yani ikisi de if-else
çözüm ve açıklayıcı yorum artık demode.
Ek not:Bu derleyici hata Java 8 önce var olduğu sonucuna gelebilir. Ancak, byte kod OpenJDK 7 ile üçlü için oluşturulan byte kodun OpenJDK 8 tarafından üretilen aynıdır. Aslında, ifadenin türü tamamen herhangi bir ek kontrolleri olmadan çalışma zamanı; kod sadece test, şube, yük, dönüş de atıfta gider. Gerisi bu bir sorun (artık) değildir emin ve gerçekten Java 8 gelişimi sırasında geçici bir sorun gibi görünüyor.