Java neden dosya adından farklı bir ada sahip bir sınıf derlememize izin veriyor?


171

Bir dosya Test.javave içinde aşağıdaki kodu var.

public class Abcd
{
        //some code here

}

Şimdi sınıf derlemiyor, ancak publicdeğiştiriciyi kaldırdığımda iyi derleniyor.

Java'nın ardında yatan neden, herkese açık olmadığında dosya adından farklı bir sınıf adı derlememizi sağlar.

Acemi bir soru olduğunu biliyorum, ama iyi bir açıklama bulamıyorum.


28
Çünkü Java. (Çünkü halka açık değildir ve aynı adlandırma kuralına uymak zorunda değildir. Bunun ötesinde, onu icat eden insanlara sormanız gerekir.)
Dave Newton

2
"İyi bir açıklama" olduğundan şüpheliyim. Kamu sınıfları için bir zorunluluktu, ancak kamuya açık olmayan sınıflar için gereksiz görülüyordu.
Kayaman

2
Benzer bir soru gibi görünüyor: stackoverflow.com/questions/7633631/…
sanket

4
Bu soru için neden bu kadar çok oy var, her şeyden önce yinelenen soru: stackoverflow.com/questions/7633631/…
GM Ramesh

2
@ Ramesh: Bu sorunun başlığı ve içeriği daha iyi .. (diğer benzerlerinden daha iyi)
Jayan

Yanıtlar:


325

Gerekçe, .javadosya başına birden fazla üst düzey sınıfa izin vermektir .

Olay dinleyicileri gibi birçok sınıf yalnızca yerel kullanım içindir ve Java'nın en eski sürümleri iç içe sınıfları desteklemez. "Dosyaadı = sınıf adı" kuralının bu şekilde rahatlatılmasaydı, bu tür sınıfların her biri, küçük .javadosyaların sonsuz çoğalmasının ve sıkıca bağlanmış kodların dağılmasının kaçınılmaz sonucu olan kendi dosyasını gerektirecekti .

Java iç içe dersleri uygulamaya koyar koymaz, bu kuralın önemi önemli ölçüde azaldı. Bugün yüzlerce Java dosyasından geçebilirsiniz, asla bundan faydalanmayacak bir dosya üzerinde değişiklik yapamazsınız.


60
+1, bu aslında bir neden sağlar , soru budur.
Dave Newton

4
Özellikle tarihsel bilgi için +1 - İç içe / anonim sınıfların ortaya çıkmasıyla, aynı kararın şimdi (geriye dönük uyumluluğa önem vermemek) yapılacaksa, her bir üst düzey sınıfa izin vermenin çok daha mantıklı olacağını düşünüyorum. dosya.
Michael Berry

1
@ berry120 Büyük olasılıkla, çünkü bu izin derleme sırasında dosya aramayı karmaşıklaştırır.
Marko Topolnik

3
@Val Diğer kişilerin geliştirmek için bir metin editörü ve CLI araçları kullanmayı tercih etmeleri, tercih ettiğiniz IDE'nin var olması, IDE'ler oluşturmanın bir anlamı olmadığını çünkü onlar olmadan geliştirme yapabileceğinizi söylemek saçmadır. Her iki yaklaşım da iyi geliştiriciler tarafından kalite kodu oluşturmak için kullanılır; ve bunlardan birini yerleştirip kumbaya söyleyen tüm geliştiricilerin oranlarından daha küçük olan tek şey, en iyi programlama dilinin ne olduğu konusunda hemfikir olacağımız ihtimaller.
Dan Is Fiddling By Firelight

5
Emacs'ın kombinasyonu (veya Vim, seçip al) ve Unix kabuk yardımcı programları olarak belki değil herşey-at-your-parmaklarınızın modern IDE ve onlar öğrenmeye kesinlikle zor, ama onlar iki sahip ezici oranla avantajları şimdiye kadar denediğim her IDE: kod tabanının büyüklüğü ne olursa olsun asla kilitlenmezler ve yazımı takip edebilirler.
zwol

80

Nedeni kapı plakaları ile aynıdır. Bazı kişiler resmi olarak ofiste yaşıyorsa (kamuya açıklanırsa) adının kapı etiketinde olması gerekir. "Alex Jones" veya "Dedektif Colombo" gibi. Birisi sadece odayı ziyaret ederse, bir yetkiliyle konuşursa veya zemini temizlerse, isminin resmi olarak kapıya konması gerekmez. Bunun yerine, kapı "Yardımcı Programlar" veya "Toplantı odası" okuyabilir.

Resmi ad veya MyClass.java Toplantı odası veya Test.java


4
Kesinlikle ilginç bir benzetme; doğrudan nasıl ilişkili olduğu hakkında biraz açıklama yapmak daha da iyi olabilir. OP (bağlantıyı mükemmel bir şekilde anlasam da) bağlantı kurmakta zorluk çekebilir
Andrew Barber

4
@AndrewBarber Tek bir ortak sınıfı modelleyemediğinden, benzetmenin gerçekten uyduğunu düşünmüyorum, dosyayı birkaç paket-özel sınıfla paylaşıyor. "Heather Santee, Yöneticisi" okuma kapı plaka gibi, ama aslında Heather ve iki sekreterleri içeren oda.
Marko Topolnik

@MarkoTopolnik Buna karışmamalıydım; Sınıf-A am korkunç benzetmeden de! ;)
Andrew Barber

@AndrewBarber Yine de yazmak istedim; sadece bir itme verdiniz :) Analoji de en akut endişeyi ifade edemez: sadece bu özellik nedeniyle derleyici tüm dosyaları ayrıştırmak zorundadır, aksi takdirde sadece dizin listesini okuyabilir ve hepsinin adlarını bilir üst düzey sınıflar.
Marko Topolnik

@AndrewBarber, analoji, dizin fikrine mükemmel bir şekilde uyuyor, uzun koridorda sadece kapı plakalarına bakarak bir kişiyi hızlı bir şekilde bulabilirsiniz, her odaya girip sormanıza gerek yoktur.
exebook

30

Java belirtimi, dosya başına en fazla bir ortak sınıfa sahip olabileceğinizi belirtir. Bu durumda, sınıf adının dosya adıyla eşleşmesi gerekir. Herkese açık olmayan tüm sınıfların dosya adından bağımsız olarak herhangi bir ada sahip olmasına izin verilir.


20
Peki "Java'nın ardındaki sebep buna izin veriyor" bize ne diyor?
Marko Topolnik

@MarkoTopolnik Çünkü bizi engellemiyor: D
Maroun

8
@MarounMaroun Peki bizi engellememenin ardındaki sebep nedir?
Marko Topolnik

@Marko Java, aynı dosyada birden fazla sınıfın tanımlanmasına izin verir (bunlardan yalnızca biri herkese açık olduğu sürece). Aynı paket içindeki tüm sınıfların farklı bir adı olması gerektiğinden, ortak olmayan sınıfların dosya adından başka bir ada sahip olmasına izin vermek dışında başka bir seçenek yoktur.
isnot2bad

2
Benim 2 sent: belki sınıf yolu içindeki sınıfların daha hızlı lokalizasyonu için bu şekilde tasarlanmıştır. Bu kural ile, dosya adlarını / yollarını incelemek sınıf keşfi için yeterlidir. Bu kural olmadan, sınıf yolu sınıf yükleyicisinin sınıfları bulmak için dosyaları açması ve ayrıştırması gerekebilir
Andrei Nicusan

14

Onlara izin vermek iç içe dersler için bir önkoşuldur. Özellikle Anonim Sınıflar gereken .java dosyalarının sayısını önemli ölçüde azaltır. Bunun için destek olmadan, kullandıkları ana sınıftan ayrı dosyalarında çok sayıda tek yöntem arabirimi uygulamasına ihtiyacınız olacaktır. (Özellikle eylem dinleyicilerini düşünüyorum)

Oracle'ın web sitesindeki Yuvalanmış Sınıflar Java eğitiminde, her birine örnek olan tüm iç içe sınıfların iyi bir açıklaması vardır. Ayrıca, yararlı olacağı bir nedeni de var:

Neden İç İçe Sınıflar Kullanılmalı?

İç içe sınıfları kullanmanın zorlayıcı nedenleri şunlardır:

  • Yalnızca tek bir yerde kullanılan sınıfları mantıksal olarak gruplamanın bir yoludur : Bir sınıf yalnızca bir sınıf için faydalıysa, o sınıfa katmak ve ikisini bir arada tutmak mantıklıdır. Bu tür "yardımcı sınıfları" iç içe yerleştirmek, paketlerini daha akıcı hale getirir.

  • Kapsüllemeyi arttırır : B'nin A olarak özel olarak ilan edilecek A üyelerine erişmesi gereken iki üst düzey sınıfı (A ve B) düşünün. B sınıfını A sınıfı içinde saklayarak A'nın üyeleri özel ilan edilebilir ve B onlara erişebilir. Ek olarak, B'nin kendisi dış dünyadan gizlenebilir.

  • Daha okunabilir ve bakımı kolay bir koda yol açabilir : Küçük sınıfları üst düzey sınıfların içine yerleştirmek, kodu kullanıldığı yere daha yakın yerleştirir.

(benimkini vurgula)

Java spec ilk günlerde aşina değilim, ama hızlı bir arama iç sınıfları Java 1.1 eklendi olduğunu gösterir.


Bir türün yalnızca başka bir tür içinde yararlı olduğu, ancak önceki türün örneklerinin, sonrakinin örnekleriyle ilişkili olmadığı durumlarda ne yapmalıdır?
supercat

Yuvalanmış sınıflar, lambdas yapmanın Java 1.2 yoludur veya 'Her şey bir nesne olduğunda birinci sınıf işlevler'dir. Bu 1.8 Sözdiziminde değişiyor. Java'nın Tür sisteminde Cebirsel Veri Türlerini modellemek istediğimizde de kullanılırlar.
Hawkeye

12

Tam tersine bakıyorum. Doğal durum, programcının hem sınıf adını hem de dosya adını bağımsız olarak seçmesi olacaktır. Muhtemelen derleme sırasında bir paketin dışından genel sınıf bulmayı basitleştirmek için, genel sınıfın ilgili ada sahip bir dosyada olması özel bir kısıtlama vardır.


4

Java'nın büyük / küçük harfe duyarlı olduğunu, ancak dosya sisteminin olması gerekmediğini unutmayın. Dosyanın temel adı "abcd", ancak sınıf "Abcd" ise, büyük / küçük harf duyarsız bir dosya sistemindeki kurala uygun olur mu? Kesinlikle büyük / küçük harf duyarlı bir kişiye taşındığında değil.

Ya da varsayalım, ABCD adında bir sınıf ve Abcd sınıfı (kötü bir fikir haline gelmeyelim: olabilir) ve program büyük / küçük harfe duyarsız bir dosya sistemine taşındı. Şimdi sadece dosyaları yeniden adlandırmakla kalmayıp, aynı zamanda sınıfları da değiştirmek zorundasınız!

Ya da dosya yoksa? Varsayalım ki standart girdide girdi alabilen bir Java derleyiciniz var. O zaman sınıf "StandardInput" olarak adlandırılmalıdır?

Dosya adlarının sınıf adlarını izlemesini gerektirmenin sonuçlarını rasyonel olarak araştırırsanız, bunun birden fazla şekilde kötü bir fikir olduğunu göreceksiniz.


Söylemek zorunda olduğunuz şeye katılıyorum, ancak belki de adlandırma mimarisinden kaynaklanan bazı sorunların, kamuya açık olmayan sınıf adlarından farklı olmasına izin verilebildiği ölçüde, özellikle soruyu cevapladığını bilmiyorum dosya adları. Ben bir dil kaynaklanan olsaydı BTW, küçük harf duyarlılığı bakımından, herhangi bir kapsamda edildi Fooilan edildi, tanımlayıcılar FOO, foo, fOovb hepsi dış kapsamları dahilinde var olsa dahi "tanımsız" olacaktır. Böyle bir tasarım, dosya adları için büyük / küçük harfe duyarlılık sorununu ortadan kaldıracaktır.
supercat

3

Ayrıca, birçok cevabın dikkat çekmediği bir nokta da, publicbeyan olmadan JVM'nin hangi sınıfların ana yönteminin çağrılması gerektiğini asla bilemeyeceğidir. Bir .java dosyasında bildirilen tüm sınıfların ana yöntemleri olabilir, ancak ana yöntem yalnızca genel olarak işaretlenmiş sınıfta çalıştırılır. HTH


0

Bir java dosyası birden fazla sınıf içerebileceğinden, bir java dosyasında iki sınıf olabilir. Ancak bir java dosyası, ortak sınıf içeriyorsa, dosya adıyla aynı adı taşıyan bir sınıf içermelidir.


Hayır, bu kural yalnızca herkese açık sınıflar için geçerlidir.
deadboy
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.