SORU
4 Mayıs 2014, Pazar


Neden &; son" Java 8 arabirim yöntemleri değil"?

Java 8'in en kullanışlı özelliklerinden biri arayüzleri default yeni yöntemlerdir. Aslında girdikleri neden: iki sebep (başkaları da olabilir) vardır

API bir tasarımcının bakış açısıyla, arabirim yöntemleri diğer düzenleyiciler kullanmak mümkün, örneğin final olmak isterdim. Bu uygun yöntem eklerken yararlı," uygulama derslerinde geçersiz kılar: . "kaza önleme olurdu

interface Sender {

    // Convenience method to send an empty message
    default final void send() {
        send(null);
    }

    // Implementations should only implement this method
    void send(String message);
}

Yukarıda zaten eğer Sender bir sınıf olsaydı yaygın bir uygulamadır:

abstract class Sender {

    // Convenience method to send an empty message
    final void send() {
        send(null);
    }

    // Implementations should only implement this method
    abstract void send(String message);
}

Şimdi, default final açıkçası anahtar kelimeler çelişen, ama varsayılan kendisi bu çelişkinin kasıtlı olduğunu varsayıyorum would not have been strictly required,, arasındaki ince farklılıkları yansıtmak için anahtar kelime< . em ^"vücut ile sınıf yöntemleri"(sadece yöntemleri)< . em ^"vücut ile arabirim yöntemleri"(varsayılan yöntem), yani henüz anlaşılamayan var olan farklılıklar.

Zaman bir noktada, static ve arabirim yöntemleri final gibi değiştiricileri için destek henüz tam olarak, citing Brian Goetz keşfedilmeyi değil

Diğer kısmı sınıf-bina desteklemek için gidiyoruz nasıl. son yöntem, özel yöntemler, korumalı gibi arabirimleri araçları, yöntemleri, statik yöntemler, vb. Cevap: henüz bilmiyoruz

2011, besbelli, static desteği geç o zamandan beri arabirimleri yöntemleri eklendi. Açıkça, bu FIRSATLAR kütüphaneler kendilerini Comparator.comparing() gibi değer bir sürü ekledi.

Soru:

final (static final) hiç 8 arayüzleri Java için yapılmış sebebi nedir?

CEVAP
5 Mayıs 2014, PAZARTESİ


Bu soru, bir dereceye kadar, What is the reason why “synchronized” is not allowed in Java 8 interface methods? ile ilgilidir

Varsayılan yöntemleri hakkında anlamak için en önemli şey, birincil tasarım hedefi olmasıdırarayüz evrimi, "(vasat) arayüzleri açmak". özellikleri değil Hayattayken bazı örtüşme arasındaki iki, ve biz olmaya çalıştım uyum sağlayabilen en son nerede yaramadı yoluna eski, bu sorular en iyi anlayan görüntülenen bu ışık. (Çok sınıf yöntemleri unutmayınarabirim yöntemleri farklı, kasıt ne olursa olsun, gereği için arabirim yöntemleri çarpma kalıtsal olabilir aslında.)

Varsayılan bir yöntemi temel fikir: varsayılan bir uygulama ile arayüzü bir yöntem, türetilmiş bir sınıf daha özel bir uygulama sağlayabilir. Ve Tasarım Merkezi arayüzü evrimi olduğundan, varsayılan yöntemleri arabirimleri eklenmesi mümkün olması çok önemli bir tasarım hedefi olduaslında sonrakaynak-uyumlu ve ikili uyumlu bir şekilde.

Çok basit: "neden final olmasın varsayılan yöntem daha sonra vücudun o zaman sadece varsayılan uygulama olacağını, ancak bir uygulama olacaktır." cevap Bu biraz basit bir cevap olsa da, bize bu soru zaten şüpheli bir yönde ilerliyor bir ipucu verir.

Şüpheli bir sebebi, uygulayıcıları için imkansız sorunlar yaratır. Örneğin, diyelim ki var:

interface A { 
    default void foo() { ... }
}

interface B { 
}

class C implements A, B { 
}

Burada her şey iyidir; C devralır foo() A. Şimdi diyelim ki B foo yöntem, varsayılan ile değiştirildi

interface B { 
    default void foo() { ... }
}

Şimdi, ne zaman gideceğiz yeniden C, derleyici bize söyler o bunu bilmiyor ne davranışı devralmak için foo(), C için geçersiz (ve seçmek için temsilci A.super.foo() eğer aranan korumak aynı davranış.) Ama B, varsayılan final yapmıştı, ve " C " yazarın kontrolü altında değilse ne? Şimdi C geri dönüşü olmayan bir şekilde bozuldu; foo() ama B final olsaydı foo() geçersiz olabilir mi geçersiz kılma olmadan derlemek.

Bu sadece bir örnek, ama önemli olan bu son yöntem gerçekten bir araçtır. daha anlamda dünyanın tek miras sınıfları (genellikle birkaç devlet için davranış), daha arabirimleri sadece katkı davranış ve çarpma miras kaldı. Çok zor nedeni hakkında "ne diğer arayüzleri olabilir karışık içine nihai uygulayıcı", ve sağlayan bir arabirim yöntemi için son olur büyük olasılıkla neden bu sorunlar (ve onlar havaya uçurmak değil kişinin kim yazdı arayüzü, ama zavallı kim çalışır kullanıcı için uygulaması.)

Onlara izin vermemek için başka bir sebep ne demek düşünmek demek istemediler. Varsayılan uygulama yalnızca sınıf (veya nesnenin alt sınıflarından) yöntemi ilanı () somut ya da soyut sağlamaması halinde mi kabul edilir. Varsayılan bir yöntem son vardı, ama bir üst sınıf zaten uygulanan yöntemi, varsayılan yazarın son bildirirken bekliyordu herhalde değil göz ardı olurdu. (Bu miras varsayılan davranış yöntemleri -- arabirimi için merkezi tasarım evrim bir yansımasıdır. Öyle olmalı Olası eklemek için varsayılan yöntem (veya varsayılan uygulama için varolan bir arabirim yöntemi) mevcut arabirimleri zaten uygulamaları olmadan değiştirme davranışı mevcut sınıflar uygulamak arabirimi, garanti sınıflar zaten çalışmaya başlamadan önce varsayılan yöntemleri eklenmiştir çalışacak aynı şekilde varlığı varsayılan yöntemleri.)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Blue Lightning TV

    Blue Lightni

    9 EKİM 2011
  • bobinire

    bobinire

    24 EYLÜL 2006
  • RealPapaPit

    RealPapaPit

    16 Mart 2009