SORU
4 ŞUBAT 2009, ÇARŞAMBA


Neden't ben bir Java arayüzü statik bir yöntem belirleyebilir mi?

İşte örnek:

public interface IXMLizable<T>
{
  static T newInstanceFromXML(Element e);
  Element toXMLElement();
}

Tabii ki bu işe yaramayacak. Ama neden olmasın?

Olası sorunlardan biri, çağırdığınızda ne olur: olurdu

IXMLizable.newInstanceFromXML(e);

Bu durumda, sadece boş bir yöntemi çağırmak gerektiğini düşünüyorum ({} gibi). Tüm alt sınıflar statik yöntemi uygulamak zorunda kalacak, statik yöntemi çağırmak iyi olurdu. Neden bu mümkün değil mi?

DÜZENLEME:Derindeki cevap arıyorum sanırım çünkü bu şekilde "Java".

Statik yöntemler üzerine yazılabilir mi neden özellikle teknolojik bir nedeni var mı? Neden Java tasarımcıları örnek yöntemleri overrideable yapmaya karar verirler ama statik yöntemler değil mi?

DÜZENLEME:Benim tasarım ile sorun arayüzleri kodlama kuralı uygulamak için kullanmaya çalışıyorum.

Bu, arayüz amacı iki yönlüdür:

  1. İXMLizable arayüzü benim eleman (polimorfizmi, gayet iyi çalışıyor kullanarak) XML uygulayan sınıflar dönüştürmek için izin istiyorum.

  2. Eğer birisi İXMLizable arabirimi uygulayan bir sınıf yeni bir örneğini yapmak istiyorsa, her zaman newİnstanceFromXML(Element e) statik oluşturucu olacağını bilecekler.

Bu, sadece arayüzünde bir yorum uygulamaktan başka bir sağlamak için başka bir yol var mı?

DÜZENLEME:Java 8, statik yöntemler artık arabirimleri izin verilir.

CEVAP
4 ŞUBAT 2009, ÇARŞAMBA


İki soru var:

  1. Neden arabirimleri statik yöntemler içerebilir mi?
  2. Neden statik yöntemler kılınabilir mi?

Bir arabirim statik yöntemler destek olamazdı neden teknik bir neden yok. Bu yinelenen soru summed up nicely by the poster. Ben orada yapılan yorumlardan biri bu noktayı vurguluyor. Sonunda, bu dili tasarımcıları tarafından sadece bir seçim olduğunu düşünüyorum. Bu aslında small language change olarak düşünülebilir. [Güncelleme: official proposal Java arayüzleri 7,] statik yöntem ekleyin yapıldı ve başlangıçta dahil edilmesi için aday olduğunu, ancak daha sonra dropped due to unforeseen complications.

Güncelleme:Java 8, . aslında, ^em>arayüzler statik yöntemler varolarak varsayılan bir uygulama ile geçersiz kılmak mümkün yöntemleri. Hala örnek alanlar var. Bu özellikler lambda ifade destek parçası, ve Part H of JSR 335. onlar hakkında daha fazla bilgi edinebilirsiniz

İkinci sorunun cevabı biraz daha karışık.

Statik yöntemler derleme zamanında çözülebilir. Dinamik gönderme mesela anlamda derleyici nesnenin somut türünü belirleyemez nerede yöntemleri, yapıyor, ve, böylece, çağırmak için yöntemi çözebilirsiniz. Ama statik bir yöntem çağrılırken bir sınıf gerektirir ve bu sınıfın zaman, dinamik gönderme derleme sırasında bilinen olduğu için gereksizdir.

Örnek yöntemleri nasıl çalıştığı hakkında biraz bilgi burada neler olduğunu anlamak için gereklidir. Gerçek uygulama oldukça farklı olduğuna eminim, ama benim yöntem benim derdim anlatayım gözlenen davranış modelleri doğru gönderme,.

Her sınıf kodu gerçek bir öbek yöntem imzaları (adı ve parametre türleri) yöntemi uygulamak için haritalar karma bir tablo var gibi. Sanal makine örneğinde bir yöntemi çağırmak için çalıştığında, nesnenin sınıf alır ve sınıfın tabloda istenen imza arar. Yöntem bir ceset bulunursa, çağrılır. Aksi takdirde, sınıf, üst sınıf alınır ve arama orada tekrarlanır. Bu yöntem kadar bu devam eder bulundu, veya NoSuchMethodError sonuçları artık üst sınıfların somon somon var.

Eğer bir süper sınıf ve alt sınıf hem bir giriş yaptıkları tablolar için aynı yöntem imzası, alt sınıf sürümü ile karşılaştı ilk ve süper sınıf versiyonu hiç kullanmadım-bu bir "geçersiz".

Şimdi, nesne örneği atlayın ve sadece bir alt sınıfı ile Başlat varsayalım. Çözünürlük olarak yukarıda, "geçersiz kılınabilir" statik yöntem. bir nevi vermeye devam edebilir Derleyici sınıf zaman, yerine bilinmeyen türde bir nesne derleme zamanında bilinen geçirilen başlayarak olduğundan çözünürlüğü derleme zaman olabilir. Nokta "" her zaman istediğiniz sürümü içeren sınıf belirtebilir beri. statik bir yöntem, geçersiz kılma yok


İşte yeni adres için biraz daha malzeme sorusuna düzenleyin.

Etkili IXMLizable her uygulama için yapıcı bir yöntem yetki istiyorsun galiba. Bir dakika için bir arayüz ile bunu uygulamak için çalışıyoruz unut, ve bu gereksinimi karşılayan bazı dersler var gibi. Nasıl kullanırsınız?

class Foo implements IXMLizable<Foo> {
  public static Foo newInstanceFromXML(Element e) { ... }
}

Foo obj = Foo.newInstanceFromXML(e);

Açıkça beton türü "derleyici gerçekten gerekli fabrika yöntemi. sahip doğrulayabilir" yeni nesne oluştururken Foo adı yapmalısınız Ve bu yüzden mi, değil mi? Eğer yoksun IXMLizable uygulamak miyim "" ve ben bir kopyasını oluşturun ve şifrenizi için . kurucu ^em>gerekli tüm arayüzü ile IXMLizable.

İmar uygulamalarının bir parçasıdırarayüz değil. Başarılı arabirimi ile çalışan herhangi bir kod oluşturucu umursamıyor. Kurucu önemseyen herhangi bir kod beton türü zaten bilmeniz gerekir, ve arayüzü göz ardı edilebilir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ODN

    ODN

    26 Kasım 2006
  • Paste Magazine

    Paste Magazi

    28 AĞUSTOS 2008
  • RickardRick

    RickardRick

    9 Mart 2007