Java neden dosya adını argümanlara koymuyor?


20

C ve C ++ 'da, ana yöntem dosya adını argv [0] dizisinin ilk konumunda tutar. Ancak Java'da dosya adı, args dizesi dizisine dahil edilmez.

Bunun pratik bir nedeni var mı? Bunun 1 tabanlı yerine 0 tabanlı komut satırı bağımsız değişkenleri ile yineleme yaptığını anlıyorum, ama bir faydası var mı? Dosya adı sadece işe yaramaz mıydı?

Yanıtlar:


17

Bazı durumlarda, bir program farklı şekillerde çalıştırılabilir ve nasıl adlandırıldığı konusunda farklı davranışlar sergileyebilir. Eğer ararsanız vimolarak vi, bir uyumluluk modunda çalışır. Bazen, ilgili birkaç programın bir sürümünü korumaya çalışmaktır - örneğin mailqve newaliasesbirçok unix sisteminde sendmailbu programların senkronize kalması için bir bağlantı vardır )


Java programları genellikle şu şekilde çağrılır:

% java -jar foo.jar argümanlar
% java Foo değişkenleri

İlk sürüm, ana sınıfı gösteren bir Manifest dosyanızın bulunduğu yerdir; ikinci sürüm Foo, sınıf yolunda bulunan sınıftaki ana yöntemi çalıştırır .

Java için sunulan bilgiler, kavanoza giden bir yol veya çağrılan sınıfın adıdır.

Kavanozun yeri kodlanacak bir şey olacak kadar önemli değil (ve aslında orijinal spesifikasyonun bir parçası değildi). Bir Kavanoz gerçekten herhangi bir şey olarak adlandırılabilir ve genellikle sürüm numaralarını içerir. Dahası, sınıfın bir .jar'da bile saklandığının garantisi yoktur (ayıklanmış olabilir).

Birlikte bir Java uygulamasını çağırmanın -jartek bir yolu vardır - Manifest'te tanımlanan sınıf. Yapılacak yeniden adlandırma yoktur.

Diğer seçenek, sınıf adıyla çağrılması doğrudan yürütme birimine işaret eder. Dahası, çarpı olarak adlandırılamaz - Bar.classbunun için kod olamazsınız, class Foosadece bu şekilde çalışmaz.

Bu argv[0], C anlamındaki bilgileri bir Java uygulamasına iletmenin gerçekten bir anlamı olmadığını göstermelidir - ya ya javaanlamsız ve keyfi olacak ya da çağrılan sınıfın adı (zaten kod yürütüyorsunuz) ( getClass().getEnclosingClass().getName()çaresiz olsaydın gibi bir şey yapabilirsin ...)).

Burada bir nokta var, bir .jar veya sınıf yolundaki sınıflarda birden fazla Ana yöntem tanımlayabilirsiniz. Ve onlara, neye dayalı bir dizi if ifadesi varmış gibi farklı davranmalarını sağlayabilirsiniz argv[0].

Geçmişte java -cp Foo.jar com.me.foo.Testhangi Testmanifest tanımlı bir tanımlı bir sınıfın ana yöntemi çağırdı benzer kod vardı .


Bundan daha fazlası olmalı. C # 'da, parametreler dosya adını içermez, ancak uygulama genellikle doğrudan yürütülür foo.exe.
svick

@svick C # 'a veya bir exe'nin nasıl paketlendiğine aşina değilim. Birkaç OS size bir kavanoz yürütülebilir (bkz yapabilir var bu Manifestosu tanımlanan giriş noktası başlattı). Benzer şeyler C # için de yapılabilir. Önemli olan şey, dosyanın adını değiştirerek giriş noktasını değiştiremezsiniz ve dosya adı, uygulamanın diğer bölümleri tarafından (sınıf yükleyici dışında) kullanılmak üzere tasarlanmamıştır.

@nqzero ( context ) - java com.me.FooKomut satırı olarak belirtirsem , yöntem com.me.Foo.main(String...)çağrılır. Bunun baska yolu yok. Ve biliyorum ki Foo çağırılıyor - bunu argv'ye yapıştırmak için bir sebep yok. Tamamen gereksiz bilgi olurdu. Tabii, üst sınıfta olabilir, ama komut satırı çağrısının ne olduğu hakkında istenen bilgilerle kesmek için önemsiz bir fırsatım var - argv'ye koymaya gerek yok.

... ve cevapta düzenlemeler önermek yerine 50 tekrar ve yorum almayı unutmayın. Belirli bir gönderiyle ilgili sorunları gündeme getirmenin çok kötü bir yoludur.

Bazen davranış kökten farklıdır. örneğin wput aslında wget.
mckenzm

-4

aslında bunun bir yararı yok, gerçekten 0 veya 1 tabanlıysa, kullandığınız programlama dilinin sözdizimine bağlıdır. değişken (dosya adı olarak adlandırılır) dile de bağlıdır, diğer dillerde farklı olabilir, sadece kullandığınız dilin doğru sözdizimini takip edin.


1
bu sorulan soruya nasıl cevap veriyor?
gnat
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.