Java soyut arayüzü


197

Bir örnek düşünün (Java'da derlenen)

public abstract interface Interface {
    public void interfacing();
    public abstract boolean interfacing(boolean really);
}

Neden bir arayüzün "bildiri" şeklinde özetlenmesi gerekir? Soyut bir arayüzle uygulanan başka kurallar var mı?


Son olarak: abstractEskiyse neden Java'ya dahil edilir? Soyut arayüz için bir geçmiş var mı?



5
" Nihayet: .... " kısmı göz önüne alındığında bir kopya değil .
aioobe

Bu ilgili soru gerçek bir örnek
Raedwald

1
Peki 'arayüz çıkar' 'Eclipse neden varsayılan olarak' özet 'ekliyor?
ModdyFire

@ModdyFire, lütfen detaylandır?
Buhake Sindi

Yanıtlar:


448

Neden bir arayüzün "bildiri" şeklinde özetlenmesi gerekir?

Değil.

public abstract interface Interface {
       \___.__/
           |
           '----> Neither this...

    public void interfacing();
    public abstract boolean interfacing(boolean really);
           \___.__/
               |
               '----> nor this, are necessary.
}

Arayüzler ve yöntemleri dolaylı olarak abstractve değiştiricinin eklenmesi fark yaratmıyor.

Soyut bir arayüzle uygulanan başka kurallar var mı?

Hayır, aynı kurallar geçerlidir. Yöntem, herhangi bir (somut) uygulayıcı sınıf tarafından uygulanmalıdır.

Soyut kullanılmıyorsa neden Java'ya dahil edilir? Soyut arayüz için bir geçmiş var mı?

İlginç soru. JLS'nin ilk baskısını kazdım ve orada bile "Bu değiştirici eski ve yeni Java programlarında kullanılmamalıdır" diyor .

Tamam, daha fazla kazma ... Çok sayıda kopuk bağlantıya çarptıktan sonra, orijinal Oak 0.2 Spesifikasyonunun (veya "manuel") bir kopyasını bulmayı başardım . Söylemeliyim ki oldukça ilginç bir okuma ve toplamda sadece 38 sayfa! :-)

Bölüm 5, Arayüzler altında, aşağıdaki örneği sağlar:

public interface Storing {
    void freezeDry(Stream s) = 0;
    void reconstitute(Stream s) = 0;
}

Ve marjda şöyle diyor

Gelecekte, arabirimlerdeki yöntemlerin bildirilmesinin "= 0" kısmı ortadan kalkabilir.

Anahtar kelime ile =0değiştirildiği varsayılarak abstract, bunun abstractbir noktada arayüz yöntemleri için zorunlu olduğundan şüpheleniyorum !


İlgili makale: Java: Soyut arayüzler ve soyut arayüz yöntemleri


3
ama soyutun kendisi eski değil mi? Arabirimler için kullanılmıyor, ancak hala soyut sınıflar ve yöntemler var.
user85421

Teşekkürler ;-) Ben nihayet bile abstractarayüz yöntemleri önünde izin için kökeni çivilenmiş düşünüyorum .
aioobe

13
Vay. Yani "tasarım gereği" kullanılmıyor. Bu JLS tasarımcıları her zaman bir şeyleri kırmaktan, daha önce hiç yayınlanmayan şeyleri kırmaktan çok korkuyorlardı ... :-)
Lukas Eder

@aioobe, bilmediğimiz Google web tarayıcısı olmalısın ... lol
Buhake Sindi

18
Btw. "herkese açık" bir arabirim bildirimindeki yöntemlerde de gerekli değildir ... her zaman herkese açıktır.
rec

37

publicArayüz yöntemlerinde olduğu gibi isteğe bağlı değildir .

Bu konudaki JLS'ye bakın:

http://java.sun.com/docs/books/jls/second_edition/html/interfaces.doc.html

9.1.1.1 Soyut Arayüzler Her arayüz dolaylı olarak soyuttur. Bu değiştirici kullanılmıyor ve yeni programlarda kullanılmamalıdır.

Ve

9.4 Soyut Metot Beyanları

[...]

Java platformunun eski sürümleriyle uyumluluk için, bir stil olarak, arabirimlerde bildirilen yöntemler için soyut değiştiriciyi yedek olarak belirtmesine izin verilir, ancak önerilmez.

Arayüz yöntemleri için genel değiştiriciyi yedek olarak belirtmesine izin verilir, ancak bir stil meselesi olarak kesinlikle önerilmez.


7
to JLS: Bir stil meselesi olarak, aynı anlamdaki iki cümleyi gereksiz yere yan yana yazmak için izin verilir, ancak kesinlikle cesaretini kırılır ...
n611x007

11

Arayüz özetini bildirmek gerekli değildir.

Tıpkı tüm bu yöntemleri herkese açıklamak (arayüz zaten herkese açıksa) veya soyut (zaten arayüzde oldukları) gereksizdir.

Yine de kimse seni durdurmuyor.

Açıkça ifade edebileceğiniz, ancak şunları yapmanız gerekmeyen diğer şeyler:

  • Bir kurucunun ilk satırında super () öğesini çağırın
  • extends Object
  • kalıtsal arayüzleri uygulamak

Soyut bir arayüzle uygulanan başka kurallar var mı?

Bir arayüz zaten "soyut". Bu anahtar kelimeyi tekrar uygulamak kesinlikle fark etmez.


2
Görünüşe göre, arayüzün kendisi paket özel ise yöntemler bile herkese açıktır.
Thilo

7

İlkbaharda akademik olmayan bir anlamı olduğunu unutmayın. Soyut arabirim geliştiricinin bunu kullanmaması için bir uyarıdır @Autowired. Umarım bahar / tutulma @Autowiredbu özelliğe bakar ve bunun kullanımı hakkında uyarır / başarısız olur.

Gerçek bir örnek: @Repository'ye @Transnational altında hizmet proxy'si aynı temel yöntemleri kullanmalıdır, ancak bu soyut arabirimi nedeniyle farklı arabirimler kullanmalıdırlar @Autowired. (Ben bu XXXSpec arayüzünü çağırıyorum)


+1 iyi hit, geniş pasifleştirilemez sessionbean enjeksiyonları bir ayırma için baktım. Belki bir kural için findbugs / checkstyle kullanabilirsiniz ....
Grim

3

Her arayüz dolaylı olarak soyuttur.
Bu değiştirici kullanılmıyor ve yeni programlarda kullanılmamalıdır.

[Java Dil Özelliği - 9.1.1.1 abstractArayüzler]

Ayrıca, arabirim üyesi yöntemlerinin dolaylı olduğunu unutmayın public abstract.
[Java Dil Özelliği - 9.2 Arabirim Üyeleri]

Bu değiştiriciler neden üstü kapalı? Burada yararlı olacak başka bir değiştirici ( 'değiştirici yok ' -modifier bile yoktur ) yoktur , bu yüzden açıkça yazmanız gerekmez.



2

Arayüzdeki tüm yöntemler soyut olduğu için arayüzler varsayılan olarak soyut olduğu için gerekli değildir.


-2

Soyut bir Arayüz en azından teoride herkesin söylediği kadar gereksiz değildir.

Bir Arayüz, tıpkı bir Sınıf gibi genişletilebilir. Uygulamanız için bir Arayüz hiyerarşisi tasarlarsanız, bir 'Temel' Arayüzünüz olabilir, diğer Arayüzleri genişletirsiniz, ancak kendi içinde bir Nesne olarak istemezsiniz.

Misal:

public abstract interface MyBaseInterface {
    public String getName();
}

public interface MyBoat extends MyBaseInterface {
    public String getMastSize();
}

public interface MyDog extends MyBaseInterface {
    public long tinsOfFoodPerDay();
}

Bir Sınıfın MyBaseInterface öğesini uygulamasını istemezsiniz, yalnızca diğer ikisi MMyDog ve MyBoat'tır, ancak her iki arabirim de MyBaseInterface arabirimini paylaşır, bu nedenle bir 'name' özelliği vardır.

Biraz akademik olduğunu biliyorum, ama bazılarının ilginç bulabileceğini düşündüm. :-)

Bu durumda, arayüzün uygulayıcılarına kendi başına uygulanacak şekilde tasarlanmamış olması gerçekten sadece bir 'işaret'. Bir derleyiciyi işaret etmeliyim (en azından denediğim güneş / ora 1.6) soyut bir arayüz uygulayan bir sınıfı derler.


3
Sorumu kesinlikle yanlış anladığınıza inanıyorum.
Buhake Sindi

3
Bu muhakemeye katılmıyorum. Her arabirimin tamamen kullanılabilir bir işlevsellik seti sağlaması gerektiğini düşünüyorum ve bu nedenle her arabirim kendi başına uygulanabilir. Ayrıca, bir derleyicinin, soyut olarak açık bir şekilde bildirilen bir arabirimi uygulayan bir sınıfı derlemeyi reddetmesinin bir nedeni olmayacaktır, çünkü tüm arabirimler zaten kesin olarak soyuttur. Bu, "soyut" anahtar kelimenin anlamını tamamen değiştirir.
BladeCoder

-3

'Soyut Arayüz' Lexical bir yapıdır: http://en.wikipedia.org/wiki/Lexical_analysis .

Derleyici tarafından gereklidir, ayrıca yazabilirsiniz interface.

Dilin Lexical yapısına çok fazla girmeyin, çünkü derleme işlemi sırasında veya bazı geriye dönük uyumluluk için özel durumlar olarak adlandırılan bazı derleme belirsizliğini çözmek için oraya koyabilirlerdi, temel Lexical yapısına odaklanmaya çalışın.

`Arayüzün özü, uygulaması değişebilen bazı soyut kavramları (fikir / düşünce / üst düzey düşünme vb.) Yakalamaktır ... yani, çoklu uygulama olabilir.

Arayüz, yakaladığı veya temsil ettiği Nesnenin özelliklerini temsil eden saf bir soyut veri türüdür.

Özellikler boşlukla veya zamanla temsil edilebilir. Alanla temsil edildiğinde (bellek depolama), beton sınıfınızın o alanda veya zamanla çalışacak bir alan ve yöntem / yöntem uygulayacağı anlamına gelir, bu da özelliği uygulama görevinin tamamen hesaplamalı olduğu anlamına gelir (daha fazla işlemci saati gerektirir) böylece özellik uygulaması için yer ve zaman arasında bir değiş tokuşunuz olur.

Eğer somut sınıfınız tüm özellikleri uygulamazsa, yine soyutlaşır, çünkü düşünce veya fikrinizin veya soyutluğunuzun bir uygulamasına sahip olursunuz, ancak tamamlanmamışsa, onu abstractsınıfına göre belirtirsiniz .

Somut bir sınıf, XYZ sınıfını yakalamaya çalıştığınız soyutluğu tam olarak yakalayacak bir sınıf / sınıflar kümesi olacaktır.

Yani Desen

Interface--->Abstract class/Abstract classes(depends)-->Concrete class

1
Bu cevap sorumu hiç cevaplamıyor. Ayrıca "It seams like you are new to Java. Gerçekten mi?
Buhake Sindi

"soyut modası geçmiş"
Manish

(1) "özet geçersiz" -> kaldırırlar ve derleyici bunu tanımayı bırakırsa "soyut arabirim" kullanarak kaynak kodun önceki sürümü daha yeni sürümde derlenmeyecektir .. Geriye dönük uyumluluğu sürdürmeleri gerekir. Eğer soyut arayüzü tanımlamak arayüzü anahtar kelime anlamı onunla birlikte çok daha temiz bir sürümü "soyut" takılıp ancak sizin gibi deneyimli programcılar için "arayüz" kısayol sağladı .. sorunuz benzer i = i + 1 == > i ++ .. seçim sizin seçiminiz: D
Manish

Kabul edilen cevaba bakın. abstractArayüzde eski olduğunu biliyorum . Neden hala kabul edilebilir olduğunu ve abstractarayüzün arkasındaki tarihin ne olduğunu bilmek istedim . Bana soyut ve arayüz üzerine Java 101 rehberi veriyorsunuz.
Buhake Sindi

Sözcüksel bir yapı değildir. Sözdizimidir. Anlamsal olarak gereksizdir. 'Derleyici gerektirmez'. Uzay / zaman ile ilgili kısım sadece sürükleniyor. Bu saçmalıkların hiçbiri sorulan soruya cevap vermiyor. Kod olmayan metinler için kod biçimlendirmesi kullanmayın.
Lorne Marquis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.