Java kaynak dosyası neden içerdiği ortak sınıfın adını taşıyor?


14

Ben Java öğrenen bir acemiyim. Java'da her kaynak dosya bir ortak sınıf içermeli ve bu kaynak dosya o ortak sınıfla aynı ada sahip olmalıdır. Ayrıca, hiçbir kaynak dosya iki ortak sınıf içeremez. Bu kısıtlama neden?


4
Özellikler olmadan, Java'nın tasarlanma biçiminin tarihsel bir tasarım eseridir. C # gibi daha yeni tasarlanmış diller, Java'ya benzer olsa da, bu kısıtlamaya sahip değildir.
gahooa

13
En iyi uygulamaları uygulamak değil mi? Bunun tek sebep olduğunu düşündüm. C # 'da teknik düzeyde bu kısıtlamaya sahip değilsiniz, ancak yine de StyleCop dosya adı ve sınıf adı eşleşmiyorsa veya aynı dosyada birkaç sınıfınız varsa şikayet edecektir. Visual Studio da sınıf-dosya ilişkisini şiddetle teşvik ediyor (sizin için dosya oluşturan sınıf diyagramlarını düşünün veya .cs dosyasını yeniden adlandırdığınızda, Visual Studio sınıfın adını yeniden düzenlemek isteyip istemediğinizi sorar).
Arseni Mourzenko

Eski stil derlenmiş bir dilde, bağlayıcı tüm referansları ve harici sembolleri bulur. Ancak Java bağlı değil - isterseniz kavanozları çalışma zamanında yükleyebilirsiniz. Bağlantı adımı olmadan, hangi dosya adını arayacağınızı biliyorsanız, sınıf adlarını sınıf yolundaki konumlarla eşlemeye çalışmak çok daha hızlıdır.
Paul Tomblin

4
@gahooa bir tasarım artefaktı değil, kasıtlı bir tasarım kararıdır. Bu birçok şeyi kolaylaştırır.

1
Grep kullanmaya ne dersiniz ?
kullanıcı

Yanıtlar:


19

Java Uzmanlarının Haber Bültenlerinden birinde Heinz Kabutz, Meşe Dili Şartnamelerini araştırıyor . O yazıyor:

Her bir ortak sınıf neden ayrı bir dosyada? (Bölüm 1)

Bu kurslarımda sıkça sorulan bir soru. Şimdiye kadar bu soruya iyi bir yanıtım olmadı. 1. bölümde şunu okuyoruz: "Her bir Meşe derleme birimi birden çok sınıf veya arabirim içerebilse de, derleme birimi başına en fazla bir sınıf veya arabirim herkese açık olabilir".

Kenar çubuğunda neden şöyle açıklanıyor: "Verimli paket ithalatı için gerekli olmasına rağmen bu kısıtlama derleyici tarafından henüz uygulanmıyor"

Oldukça açıktır - çoğu şey tasarım nedenlerini bildiğinizde - derleyici, hangi sınıfların nerede olduğunu bulmak için tüm derleme birimlerinden (.java dosyaları) ek bir geçiş yapmak zorunda kalacak ve bu da derlemeyi daha da yavaşlatacak .

http://www.javaspecialists.eu/archive/Issue055.html


1
Derlemeyi marjinal olarak daha hızlı yapmak için ? Gerçekten mi? Kodunuzu daha düzenli hale getirdiği için değil mi? Bunun doğru cevap olduğundan şüpheliyim.
BlueRaja - Danny Pflughoeft

1
@ BlueRaja-DannyPflughoeft 1998'de, çok daha büyük bir fark
yarattığından eminim

8

Düşünebileceğim nedenler

  • Rastgele bir ortak sınıf için potansiyel olarak binlerce sınıf dosyasını aramak zorunda olmadığından, derleyici için diğer sınıfları bulmayı başlangıçta biraz kolaylaştırır, sadece dosyaya gidebilir.
    • Bu muhtemelen artık önemli değil, ama asla değişmeyen erken sözleşmeye başladı
  • Derlemede bir dosyada yapılan değişiklik yalnızca o dosyayı etkiler. Birden fazla sınıf varsa, her şeyin yeniden derlenmesi gerekir
  • En iyi yöntem - Aynı dosyada birden fazla ortak sınıf bulunması, işleri kafa karıştırıcı hale getirir. Dosyaların amacı kaynak kodunu, klasörlerin amacı dosyaları organize etmektir. Belirli bir paketin tüm sınıfları tek bir 100 MB süper dosyadaysa, tüm avantajları kaybettiniz ve dosyaların faydalarından hiçbirini kazanmadınız (ayrıca düzenleme sırasında çok fazla baş ağrısı eklediniz)

1
Sınıflar ve arayüzler mutlaka kaynak kodu için en doğal alt bölümleri temsil etmez. Bir dosyada binlerce satır kodun bulunması uygun değildir, ancak bir düzine kaynak dosya arasında yayılmış 100 satırlık "gerçek" içeriğe (yorumlar veya çoğaltılmış derleyici yönergeleri hariç) sahip değildir. Ben türü için adında bir dosya olsaydı nasıl çalışacağını merak ya tanımını içeren veya başka yapar dosyayı tanımlamak?
Supercat
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.