2015-07-29 23 views
116

Java 8 Optional sınıfını kullanırken, bir değerin isteğe bağlı olarak sarılabileceği iki yol vardır. Ben Optional.ofNullable anlıyorumNeden Optional.ofNote seçeneğinden Optional.ofNullable kullanıyorsunuz?

String foobar = <value or null>; 
Optional.of(foobar);   // May throw NullPointerException 
Optional.ofNullable(foobar); // Safe from NullPointerException 

Optional kullanmanın tek güvenli yoldur, ama neden Optional.of hiç var ki? Neden sadece Optional.ofNullable kullanın ve her zaman güvenli tarafta olmalısınız?

+1

Lütfen bunu kullanmak için hangi paketin içe aktarılması gerektiğini söyleyin? – LoveToCode

+2

@LoveToCode 'java.util.Optional' - JDK 8 ya da daha sonraki sürümleri – whirlwin

cevap

154

Sorunuz, NullPointerException kodunu atabilecek kodun, bu koddan daha kötü olduğu varsayımına dayanmaktadır. Bu varsayım yanlış. Program mantığından dolayı foobar'un null olmasını asla beklemezseniz, programınızın bir hata olduğunu belirten bir NullPointerException göreceğiniz gibi Optional.of(foobar)'u kullanmak çok daha iyidir. Optional.ofNullable(foobar) kullanırsanız ve foobar, hata nedeniyle null olur, daha sonra programınız sessizce çalışmaya devam eder, bu daha büyük bir felaket olabilir. Bu şekilde bir hata çok daha sonra ortaya çıkabilir ve hangi noktada yanlış gittiğini anlamak çok daha zor olacaktır.

+47

kullanıyorsa kullanılabilir *" Program mantığından dolayı foobar'ınızın null olmasını asla beklemezseniz, kullanmak daha iyidir. filanca) '*". Bu biraz garip görünüyor - değerin hiçbir durumda "sıfır" olmayacağını bildiğimiz zaman, o zaman bir 'Opsiyonel' içine sarmak yerine neden değeri kullanmıyoruz? –

+27

@kocko, uyguladığınız arabirimin gerektirdiği gibi "İsteğe bağlı" yöntemini döndürmeniz gerekebilir (muhtemelen diğer uygulamacılar boş bir isteğe bağlı olarak döndürebilir). Ya da, bazıları null olmayan ve bazıları garanti edilemeyen isteğe bağlı bir koleksiyon/akış oluşturmak istersiniz. Ya da birkaç dalda ve tek dalda isteğe bağlı olarak yaratılan şartlı mantığa sahipsiniz, bunun null olmadığından eminsiniz. –

+19

Çünkü Opsiyonel, mevcut olabileceği veya bulunmadığı anlamına gelir. Absent! = Boş. Bu durumda null, "Foobar'ın var olmasını beklerim, ama bir hata yüzünden boştur" anlamına gelir. 'İsteğe bağlı.isPresent() == false' foobar'ın mevcut olmadığı anlamına gelir, yani bu beklenen bir durumdur, meşru davranış. – Buurman

İlgili konular