Mengapa Java tidak memasukkan nama file dalam args?

20

Dalam C dan C ++, metode utama memegang nama file di posisi pertama array di argv [0]. Di Jawa, bagaimanapun, nama file tidak termasuk dalam array string args.

Apakah ada alasan praktis untuk ini? Saya mengerti bahwa ini membuat iterasi melalui argumen baris perintah 0 berbasis bukan 1 berbasis, tetapi apakah ada manfaatnya? Apakah nama file itu dianggap tidak berguna?

Jordan L.
sumber

Jawaban:

17

Dalam beberapa kasus suatu program dapat dijalankan dengan cara yang berbeda dan menunjukkan perilaku yang berbeda tentang bagaimana program itu disebut. Jika Anda memanggil vimsebagai vi, itu berjalan dalam mode kompatibilitas. Kadang-kadang untuk mencoba mempertahankan satu versi dari beberapa program terkait - misalnya mailqdan newaliasespada banyak sistem unix adalah tautan ke sendmailsehingga program-program ini tetap sinkron)


Program Java biasanya dipanggil sebagai:

% java -jar foo.jar args
% java Foo args

Versi pertama adalah di mana Anda memiliki file Manifest yang menunjukkan kelas utama, versi kedua menjalankan metode utama di kelas yang Fooditemukan di jalur kelas.

Informasi yang disajikan untuk Jawa adalah jalur ke tabung atau nama kelas yang dipanggil.

Lokasi toples tidak cukup penting untuk dijadikan kode tempat (dan sebenarnya bukan bagian dari spek asli). Jar dapat diberi nama apa saja, dan sering kali menyertakan nomor versi. Terlebih lagi, tidak ada jaminan bahwa kelas itu bahkan disimpan dalam .jar (itu bisa saja diekstraksi).

Menjalankan aplikasi Java dengan -jarhanya memiliki satu cara untuk memasukkannya - kelas yang ditentukan dalam Manifest. Tidak ada penggantian nama yang bisa dilakukan.

Pilihan lain, dari memohonnya dengan nama kelas menunjuk langsung ke unit eksekusi. Selain itu, tidak dapat dinamai multiply - Anda tidak dapat Bar.classmenjadi kode untuk class Fooitu tidak berfungsi seperti itu.

Ini harus menunjukkan bahwa benar-benar tidak ada gunanya menyampaikan informasi argv[0]dalam arti C ke aplikasi Java - itu akan menjadi java, tidak berarti dan sewenang-wenang, atau nama kelas yang dipanggil (bahwa Anda sudah menjalankan kode keluar dari (Anda bisa melakukan sesuatu seperti getClass().getEnclosingClass().getName()jika Anda putus asa ...)).

Ada titik di sini, Anda dapat mendefinisikan beberapa metode utama di kelas dalam .jar atau di jalur kelas. Dan Anda dapat membuat mereka berperilaku berbeda seolah-olah ada serangkaian pernyataan jika berdasarkan apa argv[0]itu.

Di masa lalu saya memiliki kode yang mirip dengan java -cp Foo.jar com.me.foo.Testyang menggunakan Testmetode utama kelas daripada yang didefinisikan dalam satu yang didefinisikan dalam Manifest.


sumber
Harus ada lebih dari itu. Dalam C #, parameter tidak mengandung nama file, tetapi aplikasi biasanya dijalankan secara langsung, adil foo.exe.
svick
@ svick Saya tidak terbiasa dengan C #, atau bagaimana exe dikemas. Dalam beberapa OS, Anda dapat membuat toples yang dapat dieksekusi (lihat ini ) yang meluncurkan titik masuk yang ditentukan dalam Manifest. Hal serupa dapat dilakukan untuk C #. Kuncinya adalah Anda tidak dapat mengubah titik masuk dengan mengubah nama file, dan nama file tidak dimaksudkan untuk digunakan oleh bagian lain dari aplikasi (di luar pemuat kelas).
@nqzero ( konteks ) - Jika saya menentukan java com.me.Foosebagai baris perintah, metode com.me.Foo.main(String...)ini dipanggil. Tidak ada cara selain itu. Dan saya tahu bahwa itu Foo yang sedang dipanggil - tidak ada alasan untuk tetap dalam argumen itu. Itu akan menjadi informasi yang berlebihan. Tentu, itu bisa di kelas super, tapi saya punya kesempatan sepele untuk mencegatnya dengan informasi yang diinginkan tentang apa permintaan baris perintah - tidak perlu memasukkannya ke dalam argv.
... dan harap ingat untuk mendapatkan 50 rep dan komentar daripada menyarankan pengeditan untuk jawabannya. Ini adalah cara yang sangat buruk untuk mengangkat masalah dengan pos yang diberikan.
Terkadang perilakunya sangat berbeda. wput misalnya sebenarnya adalah wget.
mckenzm
-4

sebenarnya tidak ada manfaatnya, itu benar-benar tergantung pada sintaks bahasa pemrograman yang Anda gunakan jika berbasis 0 atau 1. variabel (Anda sebut sebagai nama file) juga tergantung pada bahasanya, bisa berbeda di bahasa lain cukup ikuti sintaks yang benar dari bahasa yang Anda gunakan.

pengguna2723735
sumber
1
bagaimana ini menjawab pertanyaan yang diajukan?
nyamuk