Java neden C ++ 'da olduğu gibi başlıkların kullanılmasına izin vermiyor?


18

Gereksinimlerimi karşılamayan aşağıdaki cevap dışında bir cevap bulamadığım bir sorum var:

"Çünkü James Gosling istemedi"

Java'nın arayüzlere sahip olabileceğini biliyorum (sadece saf sanal işlevler, öznitelikler yok), ancak sınıf tanımlarıyla aynı şey değil.


14
Onları istemenizin nedeni nedir?


6
Çoğu C ++ geliştiricisinin, her cpp dosyası için yüzlerce kLoC kopyalayarak C ++ 'ın uzun derleme sürelerine yol açan 40 yaşındaki metin değiştirme motorundan kurtulmak isteriz. Aslında C ++ 11 için uygun bir modül sistemi tasarlandı, ancak zaman eksikliği nedeniyle düştü. Yine de tekrar geleceğini düşünüyorum.
sbi

Yine de tekrar geleceğini düşünüyorum. Aslında WG21'in (ISO C ++ çalışma grubu) yalnızca "modüller" kavramını daha da değerlendirmek / geliştirmek amacıyla bir çalışma grubu vardır: SG2 "Modüller". Çok kötü mevcut durumu uykuda .
Max Truxa

Yanıtlar:


46

Gereksinimlerimi karşılamayan şu cevap: "Çünkü James Gosling istemedi."

Yine de doğru cevap bu. Dil tasarım ekibi (Gosling, Sheridan, Naughton, daha sonra Bill Joy, Ken Arnold, vb.) Başlıkların çözdüklerinden daha fazla soruna neden . Bu yüzden onları tasarladılar ve ihtiyaç duymadan mükemmel bir dil yaratabileceklerini gösterdiler.

Gönderen Java Dil Çevre beyaz kağıt Bölüm 2.2.1 :

Java ile yazılmış kaynak kodu basittir. Önişlemci, #define ve ilgili yetenekler yok, typedef yok ve bu özellik yok, artık başlık dosyalarına gerek yok. Üstbilgi dosyaları yerine, Java dil kaynak dosyaları diğer sınıfların tanımlarını ve yöntemlerini sağlar.

Gereksiz tanımlamalar, dosyaları senkronize tutma, çakışan tanımlar, gizli tanımlar - üstbilgileriniz olmadığı için bunların hiçbiri Java'da gerçekleşmez. Çıplak bir sınıf tanımı görmek istiyorsanız, doğrudan bir .java dosyasından bir tane oluşturabilirsiniz - örneğin, çoğu IDE size bir kenar çubuğundaki bir sınıfın yapısını gösterecektir, bu da aynı anlama gelir.


6
Cevabınız için teşekkürler, o zaman, başlıklar bundan dolayı daha fazla soruna neden oldu: Yedekli tanımlar, dosyaları senkronize tutma, çakışan tanımlar, gizli tanımlar. Bu yüzden izin verilmedi mi?
Etienne Noël

2
Bir sonraki C ++ Komite toplantıları hakkında birçok görüşme olduğunu unutmayın, çünkü bunlar (java, C # vb. Paketlerle bazı benzerlikler ile) dahil olmaktan daha basit ve daha verimli bir sistem olacak yeni bir "Modül" sistemi olarak düşünecekler, ancak yine de retro -içerir içerir. Yani daha iyi bir derleme sistemi, en azından teorik olarak, C ++ derlemesini daha iyi / daha verimli hale getirmek için kullanılabilir. Gosling haklıydı sanırım ve C ++ zaten dahil sistemi düzeltmek için bir yol bulmak zorunda.
Klaim

5
Mükemmel kullanılabilir değil . Java derleme sistemleri, bir kod değişikliğinden sonra hangi dosyaların yeniden derlenmesi gerektiğini belirleyemez. Bir IDE, hangi dosyaların kod değişikliği gerektirdiğini, ancak hangilerinin yeniden derlenmesi gerektiğini belirlemez. Bir yöntem imzası değişir, ancak değişiklik eski imzayla kod uyumluysa (örneğin, bir bağımsız değişken türünü float'tan double'a değiştirme), MethodNotFoundException'ı önlemek için temiz bir derleme gerekir.
kevin cline

1
@kevin: Ancak her şeyi çok fazla maliyet olmadan yeniden oluşturmak genellikle mümkündür. C ++ 'dan farklı olarak (ancak dünyadaki hemen hemen her derlenmiş dil gibi) Java, kısmi derlemenin geliştirme iş akışınızın çok değerli bir optimizasyonu olduğunu derlemek için bu kadar uzun sürmez.
Donal Fellows

1
@Donal: Java'nın oldukça hızlı bir şekilde derlendiği doğrudur, ancak tam bir derleme yapmam gerekip gerekmediğini tahmin etmekten nefret ediyorum. Yapılar her zaman çalışmalıdır .
kevin cline

16

C ++ 'ta sınıf tanımlarının ve bildirimlerinin ayrı dosyalarda bulunmasına gerek yoktur. Bu, en azından C günlerinde, kodun tek bir üst-alt taramasında ayrışmayı yapabileceğiniz anlamına gelir. Rasgele erişim depolaması olmayan makinelerde bu çok önemliydi!

Üstbilgilere sahip olmak, kaynak kodu göstermenize gerek kalmadan üstbilgiyi sağlayarak arabirimi kod kitaplığınızda yayımlamanıza da olanak tanır. Ne yazık ki C ++ 'da pimpl dehşeti gibi çözümlere yol açan özel veri üyelerini de ortaya çıkarmak zorundasınız. .

Her şeyin bir veritabanı türü yapısında saklandığı ve dosya bulunmadığı ancak yakalamadığı bir C ++ ortamı oluşturma girişimleri olmuştur.


Bunu biliyorum, ama en azından Java ile değil C ++ ile yapabilirsiniz; bu benim ana soruşturmamdı. Cevap için teşekkürler.
Etienne Noël

14

KURU prensibi nedeniyle . Java'da, bir paketteki (veya sınıftaki) sınıfları kullanmak için gereken bilgiler .class dosyasının içinde bulunur. Aynı bilgileri içeren ayrı başlık dosyaları oluşturmak, bu bilgilerin iki yerde tekrarlanmasını gerektirir.


ne yazık ki, sık sık tekrarlamak istiyorum - wsdl dosyaları, idl dosyaları vb düşünüyorum. Biri kullanabileceğiniz arabirimi açıklar ve başka bir dosya uygulamayı içerir. C ++ başlıkları (zayıf) arabirim tanımlarıdır.
gbjbaanb

6

Her dilde - son ikili kod oluşturmak için iki aşama vardır - derleme ve bağlama (elbette yükleme var, ancak burada çok fazla etkisi yoktur). Derleme sırasında sadece kancaları (çağrılacak fonksiyonların özellikleri) uygun yere koymak gerekir. Linker aslında katılıyorHer iki gerçek kod kullanılabilir olduğunda onlara . Şimdiye kadar C ++ ve Java arasında bir fark yok.

Orada olan C ++ beyanı ve tanımı ayrı olması için bir ihtiyaç, ancak,. Uygulamayı üstbilgide tutarsanız ve üstbilgi dosyası değişirse, ona bağlı olan kodun yeniden derlenmesi gerekir. Tanım, ayrı bir dosyadaymış gibi olduğunda, kodun yalnızca yeniden bağlanması gerekir.

C ++ ' ın, nesne kodunun çağıran uygulama ile birlikte sabitlendiğini ima eden statik bağlantıya sahip seçeneği olduğunu anlayın . Hem C hem de C ++ 'da, başlık dosyasında programlamanın geçersiz olduğunu ve hatta #include olmadığını unutmayın. yalnızca bu nesne dosyalarıyla bağlantı kurmanın nasıl uğraştığınız anlamına gelir.

Java'daki durum çok farklı. Her sınıf dosyası .class dosyasıyla derlenir. Gerçekten de, .class dosyasında başlık bölümü olarak işlev gören arayan sınıfı işlev derlemesine duyulan ihtiyaç. Bununla birlikte, Java'da son bağlantı yalnızca Çalışma Zamanı'nın (sanal makine) içinde, yalnızca sınıf dosyasının bayt kodu belirtimi ile yapılır.

Bkz bu ve bu


4

Etkili arayüzler ve içerilenler başlıklar; bu nedenle tanımlar ikili dosyalar ile aynıdır ve eşzamanlı olamaz. Bu, Java'daki en iyi tasarım kararlarından biridir, ancak bu bildirimleri kompaktlık ve tutarlılık için bir araya getirmenin bir yolu olmadığı küçük bir sıkıntıdır.


1

Eklemenin iyi bir nedeni, yeniden kullanmak isteyebileceğiniz kodu (ortak tanımlar gibi) belirli bir projeye özgü koddan ayırmaktır. Java, dosya başına yalnızca bir sınıf veya arabirim belirtmenizi ister ve bu da çoğunlukla eklenen başlıklara olan ihtiyacı azaltır - çünkü paylaşılan parçaları zaten kendi dosyalarında temizleyeceksiniz.

Ayrıca, derleyiciler ve derleme sistemleri, önceden derlenmiş üstbilgileri bir kereden fazla ayrıştırmamak için önbelleğe almak isteyebilir.


1
Arayüzleri paylaşılan bir projede saklayabilir ve daha sonra bağımsız projelerde uygulayabilirsiniz
Alexander Mills
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.