web-dev-qa-db-ja.com

Javaのmainメソッドが常に引数を必要とするのはなぜですか?

Javaのメインメソッドに常に引数が必要なのはなぜですか?引数を使用するときに単に書くのではなく、毎回String[] argsを書く必要があるのはなぜですか?

このようなメソッドは、Main method not foundコンパイラエラーを生成します。 mainメソッドには引数を使用しないので、これは許可されているはずです。

public static void main()
{
}

これはインタビューの質問ではありません。プログラミングの最中に頭に浮かんだ。

24
dejavu

基本的に、4つの答えがあります。

  1. それが設計された方法だからです。ええ、私はそれが循環的な理由だと知っています。しかし、要点は、これが現状であり、変更されないということです。したがって、自分の言語を設計することを計画しているのでない限り、問題は疑わしいものです。

  2. 設計のクリーンさ(別名DRY原則)。仕事ができるときに2つのエントリポイントの署名を指定しないでください。明確にできます。

  3. 意味の単純さ。 (仮説的に)Javadidvoid main(String[])void main()の両方のエントリをサポートするとしますポイント。クラスが両方のメソッドを定義した場合はどうなりますか?それはエラーですか?そうでない場合は、あいまいな場合にどちらが優先されますか?これはまだ混乱していますか?

    void main(String[])のみを認識することにより、JLSはその問題を回避します1

  4. これは、標準のCおよびC++エントリポイントシグネチャに似ています。 (確かに、一部のC/C++ランタイムは他の非標準のエントリポイントもサポートしています...しかし、それは必ずしも良いことではありません... IMO。)

これは、別の方法でそれを行うことは明白に間違っていたことを意味しません。たとえば、C#は代替の署名を提供し、開発者にエントリポイントを他の方法で指定するように要求することで曖昧さの問題に対処します。

FWIW、 このウィキペディアのページ は、いくつかの言語での「メイン」メソッドについて説明しています。


1-しかし、あなたはJavaを初めて使う人が推測する(誤って)という「問題」を抱えています複数のエントリポイントが機能し、試してみると、驚きを得るはずですが、どの設計も「当て推量によるプログラミング」に対応できるとは思いません。

32
Stephen C

アプリケーションを実行するJavaツールは、特定のシグネチャを持つmainを探すため、適切なシグネチャを呼び出していることがわかります。 Javaにはメソッドのオーバーロードがあるため、メソッドを検索するときは、かなり完全なシグネチャを指定する必要があります。付与されたJavaツールは、より複雑なことを行うことができます(特定のシグネチャを探す)そして、それが見つからなかった場合は、mainを探して、1つしか見つからない場合は呼び出します)が、Javaデザイナーが行うことを決定したものではありません(そしてsubjectively、FWIW、それが最善だと思います。シンプルにしてください)。

詳細はJava言語仕様、 第12章:実行 で確認できます。また、Java got variable引数リストでは、2つの異なる方法でmainを宣言できるようになりました。

public static void main(String[] args)
// or
public static void main(String... args)
5
T.J. Crowder

それはまさに彼らがそれを設計した方法です。その当然のことですが、そのいとこ(C#)がパラメーターの有無にかかわらずMainメソッドを許可する理由を尋ねるかもしれません、それは彼らがそれを設計した方法にすぎません。

そこには深刻な根拠はありません。各言語設計者は、どの原則に同意するべきかという好みを持っています。それまでの間、時々、それを推論したり、それに固執したりすることがあります(時々、私たちは物事を私たちの方法で取得できない場合があります)。

うーん...これは私が今使っているOSを思い出させます。 OS X Lion以前は、ウィンドウの右下隅でのみサイズを変更できます。 OSの任意のウィンドウの隅にサイズ変更機能を実装するまでに28年以上かかります。

私はMac OSが好き過ぎても、ウィンドウの1つのコーナーのみをサイズ変更できるようになるまでは、彼らのスタンスを守るために出かけません。熱心さは1つのことですが、盲目の遵守は別です。

したがって、批判的思考を実践していて、Javaのメインメソッドシグネチャがが唯一の正しい方法であると盲目的に信じていないのは良いことです


Java

C#

_var p = new {
    Lastname = "Lennon",
    Firstname = "John",
    PlacesBeen = 
        new[]
        {
            new { City = "Liverpool", Country = "England" },
            new { City = "New York", Country = "US" },
            new { City = "Tokyo", Country = "Japan" }
        }
};

return Json(p);
_

JavaScript:

_var p = {
    "Lastname" : "Lennon",
    "Firstname" : "John",
    "PlacesBeen" :             
        [
            { "City" : "Liverpool", "Country" : "England" },
            { "City" : "New York", "Country" : "US" },
            { "City" : "Tokyo", "Country" : "Japan" }
        ]
};
_

したがって、C#のファーストクラスのプロパティ(メソッドに依存しない)とコレクション初期化子を使用すると、コードが簡潔で簡潔になるだけでなく、ほとんどの開発者がデータ交換形式(JSONなど)に現在使用しているものと非常によく似たものになります。

Javaのオブジェクト初期化構文は、JSONスタイルからはるかに削除されています。この点に関して、Javaの設計上の決定(たとえば、プロパティの構文/設計)を擁護しません:-)

そこで、私が守らないのと同じように、Java Javaのプロパティ構文/設計に関する言語設計者の設計決定では、public static void main(String[] args)ツを守りません

0
Michael Buen

JVMがJavaプログラムを実行し始めると、このシグネチャ(つまり文字列配列)を持つメインメソッドを検索します

0
Android Killer