Mengapa Java memungkinkan kami untuk mengkompilasi kelas dengan nama yang berbeda dari nama file?


170

Saya punya file Test.javadan kode berikut di dalamnya.

public class Abcd
{
        //some code here

}

Sekarang kelas tidak mengkompilasi, tetapi ketika saya menghapus publicpengubah, itu mengkompilasi dengan baik.

Apa alasan di balik Java yang memungkinkan kita untuk mengkompilasi nama kelas yang berbeda dari nama file ketika itu tidak umum.

Saya tahu ini adalah pertanyaan pemula, tetapi saya tidak dapat menemukan penjelasan yang bagus.


28
Karena jawa (Karena ini bukan untuk umum, dan tidak harus mengikuti konvensi penamaan yang sama. Di luar itu, Anda perlu bertanya kepada orang-orang yang menciptakannya.)
Dave Newton

2
Saya ragu ada "penjelasan yang baik". Itu adalah persyaratan untuk kelas publik, tetapi dianggap tidak perlu untuk kelas non-publik.
Kayaman

2
Sepertinya pertanyaan serupa: stackoverflow.com/questions/7633631/…
sanket

4
Mengapa begitu banyak upvotes untuk pertanyaan ini, pertama-tama pertanyaan duplikatnya: stackoverflow.com/questions/7633631/…
GM Ramesh

2
@ Ramesh: judul dan isi pertanyaan ini lebih baik .. (daripada yang serupa lainnya)
Jayan

Jawaban:


325

Alasannya adalah untuk memungkinkan lebih dari satu kelas tingkat atas per .javafile.

Banyak kelas - seperti pendengar acara - hanya untuk penggunaan lokal dan versi Jawa yang paling awal tidak mendukung kelas bersarang. Tanpa pelonggaran aturan "nama file = nama kelas" ini, masing-masing dan setiap kelas akan membutuhkan file sendiri, dengan hasil yang tak terhindarkan dari proliferasi .javafile kecil yang tak berujung dan hamburan kode yang digabungkan secara ketat.

Segera setelah Java memperkenalkan kelas bersarang, pentingnya aturan ini berkurang secara signifikan. Hari ini Anda dapat melalui ratusan file Java, tidak pernah memanfaatkan satu yang mengambil keuntungan darinya.


60
+1, ini sebenarnya memberikan alasan , yang merupakan pertanyaan.
Dave Newton

4
+1 terutama untuk info historis - Saya menduga bahwa dengan munculnya kelas bersarang / anonim, jika keputusan yang sama dibuat sekarang (tidak peduli dengan kompatibilitas ke belakang), akan lebih masuk akal untuk hanya mengizinkan satu kelas tingkat atas per mengajukan.
Michael Berry

1
@berry120 Mungkin cukup, karena kelonggaran ini mempersulit pencarian file saat kompilasi.
Marko Topolnik

3
@ Val Menolak bahwa orang lain lebih suka menggunakan editor teks dan alat CLI untuk mengembangkan karena Anda IDE yang Anda inginkan ada sama konyolnya dengan mengatakan tidak ada gunanya membuat IDE karena Anda dapat melakukan pengembangan tanpa mereka. Kedua pendekatan tersebut digunakan oleh pengembang yang baik untuk membuat kode berkualitas; dan satu-satunya hal yang lebih kecil daripada peluang semua pengembang menentukan salah satu dari mereka dan menyanyikan kumbaya adalah kemungkinan bahwa kita semua akan sepakat tentang apa satu-satunya bahasa pemrograman terbaik.
Dan Is Fiddling By Firelight

5
Kombinasi Emacs (atau Vim, ambil racun Anda) dan utilitas shell Unix mungkin tidak semuanya seperti yang ada di ujung jari Anda sebagai IDE modern, dan mereka jelas lebih sulit untuk dipelajari, tetapi mereka memiliki dua kelebihan luar biasa dibandingkan dengan setiap IDE yang pernah saya coba: mereka tidak pernah crash, tidak peduli seberapa besar basis kode, dan mereka dapat mengikuti pengetikan saya.
zwol

80

Alasannya sama dengan untuk pelat pintu. Jika seseorang secara resmi berada di kantor (dinyatakan publik) namanya harus ada di label pintu. Seperti "Alex Jones" atau "Detective Colombo". Jika seseorang hanya mengunjungi ruangan, berbicara dengan pejabat atau membersihkan lantai, nama mereka tidak harus secara resmi diletakkan di pintu. Sebagai gantinya, pintu dapat membaca "Utilities" atau "Meeting room".

Nama resmi atau MyClass.java Ruang pertemuan atau Test.java


4
Jelas analogi yang menarik; mungkin akan lebih baik dengan sedikit penjelasan tentang bagaimana hubungannya secara langsung. OP mungkin mengalami kesulitan membuat koneksi (meskipun saya memahaminya dengan sempurna)
Andrew Barber

4
@AndrewBarber Saya tidak berpikir analoginya benar-benar cocok karena tidak memodelkan satu kelas publik, berbagi file dengan beberapa kelas paket-pribadi. Seperti pelat pintu bertuliskan "Heather Santee, Manajer", tetapi ruangan itu sebenarnya berisi Heather dan dua sekretarisnya.
Marko Topolnik

@MarkoTopolnik Saya seharusnya tidak terlibat dalam ini; Saya kelas-A mengerikan di analogi! ;)
Andrew Barber

@AndrewBarber saya ingin menulisnya; Anda baru saja memberi dorongan :) Analogi ini juga gagal untuk mengungkapkan kekhawatiran yang paling akut: hanya karena fitur ini kompiler harus menguraikan semua file untuk menemukan semua kelas di mana jika tidak, ia hanya bisa membaca daftar direktori dan mengetahui nama-nama semua kelas tingkat atas.
Marko Topolnik

@AndrewBarber, analoginya sangat cocok dengan ide direktori, di koridor panjang Anda dapat dengan cepat menemukan seseorang hanya dengan melirik pelat pintu, Anda tidak perlu masuk ke setiap kamar dan bertanya.
exebook

29

Spesifikasi Java menyatakan Anda hanya dapat memiliki paling banyak satu kelas publik per file. Dalam hal ini, nama kelas harus cocok dengan nama file. Semua kelas non-publik diizinkan memiliki nama apa pun, apa pun nama filenya.


20
Tapi "apa alasan di balik Jawa memungkinkan" kita ini?
Marko Topolnik

@MarkoTopolnik Karena itu tidak menghalangi kita: D
Maroun

8
@MarounMaroun Tapi apa alasan di balik tidak mencegah kita?
Marko Topolnik

@Marko Java memungkinkan untuk memiliki beberapa kelas yang didefinisikan dalam file yang sama (selama hanya satu dari mereka yang publik). Karena semua kelas dalam paket yang sama harus memiliki nama yang berbeda, tidak ada pilihan lain selain mengizinkan kelas non-publik untuk memiliki nama selain nama file.
isnot2bad

2
2 sen saya: mungkin dirancang dengan cara ini untuk lokalisasi kelas yang lebih cepat di dalam classpath. Dengan konvensi ini, memeriksa nama file / jalur sudah cukup untuk penemuan kelas. Tanpa konvensi ini, loader classpath class mungkin perlu membuka dan mengurai file untuk menemukan kelas
Andrei Nicusan

13

Saya pikir mengizinkan mereka adalah prasyarat untuk kelas bersarang. Kelas Anonim khususnya secara dramatis mengurangi jumlah file .java yang diperlukan. Tanpa dukungan untuk ini, Anda akan memerlukan banyak implementasi antarmuka metode tunggal dalam file mereka sendiri yang terpisah dari kelas utama yang digunakan. (Saya sedang memikirkan pendengar aksi khususnya)

Ada penjelasan yang bagus dari semua kelas bertingkat di tutorial Java Nested Classes di situs web Oracle, yang memiliki contoh masing-masing. Ini juga memiliki alasan mereka berguna, yang saya kutip:

Mengapa Menggunakan Kelas Bertingkat?

Alasan kuat untuk menggunakan kelas bersarang meliputi yang berikut:

  • Ini adalah cara pengelompokan kelas secara logis yang hanya digunakan di satu tempat : Jika kelas hanya berguna untuk satu kelas lain, maka logis untuk menanamkannya di kelas itu dan menjaga keduanya bersama-sama. Menempatkan "kelas pembantu" seperti itu membuat paket mereka lebih efisien.

  • Ini meningkatkan enkapsulasi : Pertimbangkan dua kelas tingkat atas, A dan B, di mana B membutuhkan akses ke anggota A yang dinyatakan dinyatakan pribadi. Dengan menyembunyikan kelas B dalam kelas A, anggota A dapat dinyatakan pribadi dan B dapat mengaksesnya. Selain itu, B sendiri dapat disembunyikan dari dunia luar.

  • Ini dapat menyebabkan kode lebih mudah dibaca dan dipelihara : Bersarang kelas kecil dalam kelas tingkat atas menempatkan kode lebih dekat ke tempat kode itu digunakan.

(penekanan milikku)

Saya tidak terbiasa dengan Java spec pada masa-masa awal, tetapi pencarian cepat menunjukkan kelas-kelas dalam ditambahkan di Java 1.1.


Apa yang harus dilakukan seseorang dalam kasus-kasus di mana suatu tipe hanya berguna di dalam tipe yang lain, tetapi instans dari tipe sebelumnya tidak terkait dengan instans dari tipe yang terakhir?
supercat

Kelas bersarang adalah Java 1.2 cara melakukan lambdas atau 'Fungsi Kelas Pertama ketika Semuanya adalah Obyek'. Ini berubah dalam Sintaks 1.8. Mereka juga digunakan ketika kita ingin memodelkan Tipe Data Aljabar di sistem Tipe Java.
hawkeye

12

Saya melihatnya sebaliknya. Kondisi alami bagi programmer adalah memilih nama kelas dan nama file secara mandiri. Mungkin untuk menyederhanakan menemukan kelas publik dari luar paket selama kompilasi, ada batasan khusus bahwa kelas publik berada dalam file dengan nama yang sesuai.


4

Perhatikan bahwa Java peka huruf besar-kecil, tetapi sistem file tidak perlu. Jika nama dasar file adalah "abcd", tetapi kelasnya adalah "Abcd", apakah itu sesuai dengan aturan pada sistem file case-insensitive? Tentu tidak ketika porting ke case-sensitive.

Atau misalkan Anda kebetulan memiliki kelas yang disebut ABCD, dan kelas Abcd (jangan anggap itu ide yang buruk: itu bisa terjadi) dan program ini porting ke sistem file case yang tidak sensitif. Sekarang Anda tidak hanya harus mengganti nama file, tetapi juga kelas, oops!

Atau bagaimana jika tidak ada file? Misalkan Anda memiliki kompiler Java yang dapat mengambil input pada input standar. Jadi, kelas harus dinamai "StandardInput"?

Jika Anda secara rasional mengeksplorasi implikasi yang memerlukan nama file untuk mengikuti nama kelas, Anda akan menemukan bahwa itu adalah ide yang buruk dalam lebih dari satu cara.


Saya setuju dengan apa yang Anda katakan, tetapi saya tidak tahu bahwa itu terutama menjawab pertanyaan kecuali mungkin sejauh beberapa masalah yang dihasilkan dari arsitektur penamaan dapat diredakan dengan membiarkan nama kelas non-publik berbeda dari nama file. BTW, berkaitan dengan kasus-sensitivitas, jika saya berasal bahasa, dalam lingkup setiap yang Foodinyatakan, pengidentifikasi FOO, foo, fOo, dll semua akan "tidak terdefinisi" bahkan jika mereka ada dalam lingkup luar. Desain seperti itu akan menghilangkan masalah sensitivitas kasus untuk nama file.
supercat

3

Juga satu hal lain yang terlewatkan oleh banyak jawaban adalah bahwa tanpa publicdeklarasi, JVM tidak akan pernah tahu metode utama kelas mana yang perlu dipanggil. Semua kelas dideklarasikan dalam satu file .java semua dapat memiliki metode utama, tetapi metode utama dijalankan hanya pada kelas yang ditandai sebagai publik. HTH


0

Karena file java dapat berisi lebih dari satu kelas, itu mungkin memiliki dua kelas dalam satu file java. Tetapi file java harus mengandung kelas sebagai nama yang sama dengan nama file jika mengandung kelas publik.


Tidak, aturan itu hanya berlaku untuk kelas publik.
deadboy
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.