Sıfır Sorun: JSpecify ile Java'da En İyi Sıfır Kontroller
Bir yıl önce Java'da sıfır çekler hakkında yazdım. Yöntem ve üreticilerin parametreleri için hala anlamlıdır. null (Örneğin. @NonNull). Ancak bu arada, Jspecify'ın 1.0 sürümü ortaya çıktığından, destek önemli ölçüde daha iyi hale geldi. Konuyla ilgili bir güncelleme için kullanmak istiyorum.

Hendrik Advers (@hendrikebbers), JCP uzman grubunun bir üyesi olan Java'nın şampiyonu ve farklı Javaone rock yıldızı hoparlörleri aldı. Kendi açık unsurları şirketi ile Hendrik şu anda Hedera Hashgraph'ı tasarlamaya ve hizmetlerini halka açık hale getirmeye yardımcı oluyor. Hendrik aynı zamanda Juug Dortmund ve Cyberland tarafından ve tüm dünyada Java teması hakkında dersler ve seminerler düzenliyor. “Mastering JavaFx 8 Controls” adlı kitabı 2014 yılında Oracle Press tarafından yayınlandı. Hendrik, TSC Emptopenjdk ve Eclipse WG benimseyenlerin bir üyesidir.
JSpecify için Geniş İşbirliği
JSpecify, önceki sıfır yönetim tedarikçilerinin nihayet kullanılabilir bir standart tanımlamak için topladığı açık kaynaklı bir projedir. Bunlar arasında Google, Jetbrain, Meta, Microsoft ve Oracle yer alıyor. Jspecify, Java modül sisteminde eksiksiz bir formdur, bağımlılığı yoktur ve sadece dört nota ile, yönetim için modern bir Java projesinde ihtiyacınız olan her şeyi sunar null Parametrelerde belirtmek için. Ek açıklamalar kullanan örnek kod aşağıdaki gibi görünebilir:
static @Nullable String emptyToNull(@NonNull String x) {
return x.isEmpty() ? null : x;
}
static @NonNull String nullToEmpty(@Nullable String x) {
return x == null ? "" : x;
}
Diğer kod sınavları Jspecify Kullanıcı Kılavuzu'nda mevcuttur.
Bununla birlikte, Jspecify ek açıklamasının saf bağlanmasının çok az etkisi vardır. Derleyici kodu çevirmeye devam ediyor null Bir tane ile @NonNull-Açıklamalı parametreler ve tercüme edilen kod bir istisnayı otomatik olarak etkinleştirmez.
Ek açıklamaların avantajları
Ek açıklamaların avantajı, diğer şeylerin yanı sıra, geliştirme ortamlarıyla etkileşimde görülebilir. Intellij ek açıklamaları tanıyabilir ve koddaki ek açıklamaları ihlal eden uyarılar veya hatalar gösterebilir. Güvenli olmak ve bu sorunlarla koda izin vermemek istiyorsanız, ek yardımlar kullanabilirsiniz. Uber tarafından geliştirilen açık kaynak aracı Nulleway, ek açıklamaların tanımı gözlenmiyorsa, yapı süresi için bu ek açıklamaları kontrol edebilir ve hataları tetikleyebilir. Derecenize veya maven binanıza her şeyi eklerseniz, derleme sırasında otomatik olarak bir hata yaparsınız:
error: [NullAway] passing @Nullable parameter 'null' where @NonNull is required
myMethod(null);
^
Bu araç zinciriyle kodunuzu çok daha sağlam bir şekilde alabilirsiniz NullPointerExceptionsüreden kaçının.
Panacea yok
Artık düşünmek zorunda değilsin NullPointerExceptions Yapmak? Ne yazık ki, o kadar basit değil. Bu önlemler yalnızca kodunuzu kontrol edebilir. Bu tür ek açıklamaları kullanmayan bağımlılıklarınız varsa, bir parametre olup olmadığınızı bilemezsiniz. null teslim edebilir ve hangi davranış tetiklenir. Bu nedenle, farklı yerlerde değişkenler kullanmak hala önemlidir null Kontrol etmek için.
Diğer projeler tarafından çağrılan kütüphaneler veya kod geliştiren herkes, kullanıcıların tanımlanan kurallara ve bir @NonNull Parametreler gerçekten kimseye dikkat etmedi null bağış yapmak. Bu nedenle, ister bağımlılıklarınızla veya kamuya açık bir FIR'da, kodunuzun bağlamından ayrıldığınızda her zaman sıfır kontrol etmek önemlidir.
Ayrıca, openjdk java.util.Objects.requireNonNull(obj, message) Ayrıca, seçim araçları. Her zaman önemli istisnalar oluşturmak için, varyantın mesajın parametresiyle kullanmak gerekir, aksi takdirde sistem bir NullPointerException Lancia mesajı olmadan. Her şey halka açık bir köknar için görünüyor:
public void setName(@NonNull String name) {
this.name = Objects.requireNonNull(name, “name must not be null”);
}
Kritik bir performans performansı için çalışan herkes kontrol yöntemleri olmadan yapmalıdır. JIT derleyicisi fırsatlar Objects.requireNonNull(...) Ek açıklama yoluyla @ForceInline Özellikle ve yığının performansını ve boyutunu optimize etmek için yöntemin tüm görünümlerini doğrudan çağrı yöntemine (satır içi) ekler.
En iyi uygulamaları ve bir standardı takip eden adımlar
Java topluluğunun bugünün statüsüne ulaşması uzun zaman aldı ve sıfır yönetim ile ilgili ek açıklamalar içeren temiz ve hassas bir kütüphane var. 2006 yılında JSR305 olarak başlatılan ve maalesef hızla düşürülen şey, SLF4J (Java için basit kayıt cephesi) gibi fiili bir standartta çok çeşitli ek açıklamalar ve uygulamalarla ilgili birçok problemden sonra gelişebilir.
Jspecify açıkça burada doğru şekilde gidiyor. Nulway gibi bir aletin hüküm sürmesi ve basit bir kullanım ve en iyi uygulamalarla, her proje ile daha iyi olmasına izin vermesi güzel olurdu null uğraşmak. Nulway gibi henüz ek açıklamalar ve araçlar kullanmamış herkes bunları denemelidir. Şimdi başlamak için doğru zaman.
Not: Bu makaleyi yazmak için paralel olarak, OpenJDK'da yeni bir JEP ile daha iyi bir yerel destek açıklandı. JEP'de tartışılan özelliklerin OpenJDK'nın bir LTS versiyonunda yol alması biraz zaman alacağından, burada açıklanan fonlar ve araçlar hala net bir öneridir. Ancak JEP, bir makaleye daha yakından bakmak için yeterli yönler sunar.
(RME)