Java 8 ve sonraki sürümlerde, bu sorunun cevabı hala geçerlidir, ancak şimdi daha ayrıntılıdır.
İlk olarak, kabul edilen cevaptaki şu ifadeler doğru kalır:
- arabirimler, bir sözleşmedeki örtük davranışlarını belirtmek içindir (geçerli sayılmaları için sınıfları uygulayanların uyması gereken davranış kuralları beyanı)
- sözleşme (kurallar) ile uygulama (kuralların programlı kodlaması) arasında bir ayrım vardır
- arayüzde belirtilen yöntemler HER ZAMAN uygulanmalıdır ZORUNLU (bir noktada)
Peki, Java 8'de yeni olan nüans nedir? "İsteğe Bağlı Yöntemler" den bahsederken , aşağıdakilerden herhangi biri artık uygundur:
1. Uygulanması sözleşmeye bağlı olarak isteğe bağlı olan bir yöntem
"Üçüncü ifade", soyut arayüz yöntemlerinin her zaman uygulanması gerektiğini ve bunun Java 8+ için geçerli olduğunu söyler. Bununla birlikte, Java Koleksiyonları Çerçevesinde olduğu gibi, bazı soyut arayüz yöntemlerini sözleşmede "isteğe bağlı" olarak tanımlamak mümkündür.
Bu durumda, arayüzü uygulayan yazar, yöntemi uygulamamayı seçebilir. Bununla birlikte, derleyici bir uygulama konusunda ısrarcı olacaktır ve bu nedenle yazar, bu kodu belirli uygulama sınıfında gerekmeyen isteğe bağlı yöntemler için kullanır:
public SomeReturnType optionalInterfaceMethodA(...) {
throw new UnsupportedOperationException();
}
Java 7 ve önceki sürümlerde, bu gerçekten var olan tek tür "isteğe bağlı yöntem" idi, yani, uygulanmadığı takdirde bir UnsupportedOperationException atan bir yöntemdi. Bu davranış zorunlu olarak arayüz sözleşmesi tarafından belirtilir (örn. Java Collections Framework'ün isteğe bağlı arayüz yöntemleri).
2. Yeniden uygulanması isteğe bağlı olan varsayılan bir yöntem
Java 8, varsayılan yöntemler kavramını tanıttı . Bunlar, uygulaması arayüz tanımının kendisi tarafından sağlanabilen ve sağlanan yöntemlerdir. Genelde, yalnızca yöntem gövdesi diğer arabirim yöntemleri (yani, "ilkeller") kullanılarak yazılabildiğinde ve this
"sınıfı bu arabirimi uygulayan bu nesne" anlamına gelebildiğinde varsayılan yöntemler sağlamak mümkündür .
Varsayılan bir yöntem, arabirimin sözleşmesini yerine getirmelidir (tıpkı diğer arabirim yöntemlerinin uygulanması gerektiği gibi). Bu nedenle, bir uygulama sınıfında arabirim yönteminin bir uygulamasını belirtmek yazarın takdirine kalmıştır (davranış amacına uygun olduğu sürece).
Bu yeni ortamda, Java Collections Framework şu şekilde yeniden yazılabilir:
public interface List<E> {
:
:
default public boolean add(E element) {
throw new UnsupportedOperationException();
}
:
:
}
Bu şekilde, "isteğe bağlı" yöntem add()
, uygulama sınıfı kendi başına hiçbir yeni davranış sağlamazsa bir UnsupportedOperationException varsayılan davranışına sahiptir, bu tam olarak olmasını isteyeceğiniz şeydir ve List sözleşmesiyle uyumludur. Bir yazar, List uygulamasına yeni öğelerin eklenmesine izin vermeyen bir sınıf yazıyorsa add()
, varsayılan davranış tam olarak gerekli olduğu için uygulanması isteğe bağlıdır.
Bu durumda, yukarıdaki "üçüncü ifade" hala geçerlidir, çünkü yöntem arayüzün kendisinde uygulanmıştır.
3. Optional
Sonuç döndüren bir yöntem
Son yeni tür isteğe bağlı yöntem, basitçe bir Optional
. Optional
Sınıf ile uğraşan bir kararlılıkla daha nesne yönelimli yol sağlar null
sonuçları.
Yeni Java Streams API ile kodlama yaparken yaygın olarak görülen tür gibi akıcı bir programlama stilinde, herhangi bir noktada boş bir sonuç, programın bir NullPointerException ile çökmesine neden olur. Optional
Sınıf kazasında istemci kodu neden olmadan akıcı stili sağlayan bir şekilde müşteri koduna boş sonuçlarını döndürmek için bir mekanizma sağlar.