2015-12-04 28 views
29

Java 8 ile @NotNull ek açıklamasını kullanmaya ve bazı beklenmedik sonuçlar almaya başladım.Yöntem argümanında NotNull Ek Açıklama kullanma

public List<Found> findStuff(@NotNull List<Searching> searchingList) { 
    ... code here ... 
} 

ben argümanı searchingList null değeri geçen bir JUnit test yazdım:

Böyle bir yöntem var. Bir tür hatanın gerçekleşmesini bekliyordum ama sanki orada bir açıklama yokmuş gibi geçti. Bu beklenen davranış mı? Anladığım kadarıyla, bu, kontrol plakası boş kontrol kodunu yazmanıza izin vermekti.

@NotNull'ın tam olarak ne yapması gerektiği ile ilgili bir açıklama büyük ölçüde takdir edilecektir.

+8

'@ NotNull' yalnızca bir ek açıklamadır. Ek açıklamalar kendi başlarına hiçbir şey yapmaz. Derleme zamanında bir ek açıklama işlemcisine veya çalışma zamanında işleyen bir şeye gereksinim duyarlar. –

+0

Kodu bir uygulama sunucusunda mı çalıştırıyorsunuz (örneğin [Arquillian] (http://arquillian.org/) kullanarak)? –

+0

@SotiriosDelimanolis - Öyleyse, bu nokta ne anlama geliyor? Bu durumda, hala boş işaretçi doğrulama koduna ihtiyacınız vardır. – DavidR

cevap

42

@Nullable ve @NotNull hiçbir şeyi kendi başına yapmaz. Dokümantasyon araçları olarak hareket etmeleri gerekiyor.

  1. boş dönebilirsiniz yöntemleri çağırma:

    @Nullable Notu zaman bir NPE çeki tanıtmak gerekliliği hatırlatır.

  2. Boş bırakılamayan değişkenler (alanlar, yerel değişkenler, parametreler).

    1. bir yöntem boş dönmemesi:

    @NotNull Annotation

  3. aşağıdaki ilan açık sözleşme, aslında vardır.
  4. Bir değişken (alanlar, yerel değişkenler ve parametreler gibi) boş değer tutamaz.

örnek:

yazma yerine

: Eğer

public void setX(
    @NotNull 
    final Object aX) 
{ 
... 
} 
+0

Sadece NotNull bölümünün 2. bölümünü açıklığa kavuşturmak için, gerçekten zorlanamayacağından “yapamaz”, “yapamaz” demeli, “yapamaz” mı demeliyiz? Ya da çalışma zamanında uygulanabiliyorsa, bunun için nasıl gidiyorsunuz? – DavidR

+0

Evet, bir "olmamalı" ... yöntem uygulaması sözleşmeyi zorlamalıdır. –

+1

Alternatif olarak, Java 8'de 'İsteğe Bağlı ',' @ Null' yerine dönüş değerlerinde ve parametre listelerinde '@ Null' yerine yöntem aşırı yüklenmesi kullanılabilir: http://dolszewski.com/java/java -8-optional-use-cases/ –

3

SO @NotNull sadece etikettir ... bunu doğrulamak isterseniz kullanabilirsiniz

/** 
* @param aX should not be null 
*/ 
public void setX(
    final Object aX) 
{ 
... 
} 

, o zaman, hazırda beklemedeki doğrulayıcı gibi bir şey kullanmalısınız jsr 303

+0

olması iyi olurdu. Bunu yöntemin başlangıcına nasıl koyarım? – DavidR

+0

evet ... yöntemin başlangıcında ... bu yalnızca doğrulama uygulamalarından biridir, başkaları da olabilir ... – Naruto

+0

Tamam. Fakat bu kodun ne anlama geldiğinin önemi, param argümanında @NotNull ek açıklamalarına sahip olmamakla birlikte değişmeyecek mi? – DavidR

İlgili konular