Javaがファイル名を引数に入れないのはなぜですか?


20

CおよびC ++では、mainメソッドは、argv [0]の配列の最初の位置にファイル名を保持します。ただし、Javaでは、ファイル名はargs文字列配列に含まれません。

これには実用的な理由がありますか?これにより、コマンドライン引数を1ベースではなく0ベースで反復処理することを理解していますが、利点はありますか?ファイル名は役に立たないとみなされましたか?

回答:


17

場合によっては、プログラムはさまざまな方法で実行され、呼び出される方法についてさまざまな動作を示すことがあります。vimとして呼び出すとvi、互換モードで実行されます。時には、いくつかの関連プログラムの1つのバージョンを維持しようとすることがあります。たとえばmailqnewaliases多くのUNIXシステムでは、sendmailこれらのプログラムの同期を保つためのリンクがあります)


Javaプログラムは通常、次のように呼び出されます。

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

最初のバージョンでは、メインクラスを示すマ​​ニフェストファイルがあります。2番目のバージョンFooでは、クラスパスで見つかったクラスのメインメソッドが実行されます。

Java用に表示される情報は、jarへのパスまたは呼び出されるクラスの名前です。

jarの場所は、コーディングの対象となるほど重要ではありません(実際には、元の仕様の一部ではありませんでした)。Jarには実際に名前を付けることができ、多くの場合バージョン番号が含まれます。さらに、クラスが.jarに保存されたという保証はありません(抽出された可能性があります)。

を使用し-jarてJavaアプリケーションを呼び出す方法は、マニフェストで定義されたクラスの1つしかありません。実行できる名前の変更はありません。

クラス名で呼び出す別のオプションは、実行ユニットを直接指します。さらに、それは複数の名前を付けることはできません-あなたはそれがそのように動作しないだけBar.classのコードになるclass Fooことはできません。

これはargv[0]、Cの意味での情報をJavaアプリケーションに渡す意味がないことを示しているはずです- java意味がなく、任意であるか、呼び出されているクラスの名前(既にコードを実行していること)の(あなたgetClass().getEnclosingClass().getName()が必死だった場合のような何かをすることができます...))。

ここにはポイントがあります。複数のMainメソッドを.jarのクラスまたはクラスパスで定義できます。また、何argv[0]に基づいて一連のifステートメントがあるかのように、それらを異なる動作にすることができます。

私は過去に、マニフェストで定義されたもので定義されたものではなくjava -cp Foo.jar com.me.foo.TestTestクラスのMainメソッドを呼び出したコードに似ていました。


それだけではありません。C#では、パラメーターにファイル名は含まれませんが、アプリケーションは通常、直接実行されfoo.exeます。
svick

@svick C#についても、exeがどのようにパッケージ化されているかもよく知らない。いくつかのOSでは、マニフェストで定義されたエントリポイントを起動するjar実行可能ファイル(これを参照)を作成できます。C#についても同様のことが行われます。重要なことは、ファイルの名前を変更してもエントリポイントを変更できないこと、およびファイル名がアプリケーションの他の部分(クラスローダー以外)で使用されることを意図していないことです。

@nqzero(context)- java com.me.Fooコマンドラインとして指定すると、メソッドcom.me.Foo.main(String...)が呼び出されます。それを回避する方法はありません。呼び出されているのはFooであることを知っています。それをargvに固定する理由はありません。それは純粋に冗長な情報です。もちろん、それはスーパークラスにある可能性がありますが、コマンドライン呼び出しが何であるかという望ましい情報でそれをインターセプトする簡単な機会があります-argvに入れる必要はありません。

...そして、回答の編集を提案するのではなく、50人の担当者とコメントを取得することを忘れないでください。特定の投稿で問題を提起するのは非常に貧弱な方法です。

動作が根本的に異なる場合があります。たとえば、wputは実際にはwgetです。
mckenzm

-4

実際には利点はありません。0ベースまたは1ベースの場合、使用しているプログラミング言語の構文に依存します。変数(ファイル名と呼ぶ)も言語に依存します。他の言語では、使用している言語の正しい構文に従うだけで異なる場合があります。


1
これは質問にどう答えますか?
gnat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.