web-dev-qa-db-ja.com

Javaメインメソッド、優れたコーディングスタイル

私は友人と、Javaでのmainメソッドの正しくて良い使い方についてかなり長い間話し合ってきました。基本的に、次のようなクラスがあります。

public class AnImporter implements Runnable {
  // some methods, attributes, etc.
}

しかし、主な方法はどこに置くのでしょうか? 「コードを所属する場所に保持する」ことをお勧めします。したがって、上記のコードを次のように変換します。

public class AnImporter implements Runnable {
  public static void main(String [] args){
    // Startup code for Importer App here
  }
  // some methods, attributes, etc.
}

私の相棒は「スタートアップコードはアプリケーション自体とは何の関係もない」と主張しているので、次のように別のクラスに配置する必要があります。

public class AnImporter implements Runnable {
  // some methods, attributes, etc.
}

public class AnApplication {
  // Nothing here
  public static void main(String [] args){
    AnImporter a = new AnImporter();
    // Startup code here
  }
  // Nothing here
}

しばらくの間この問題について話し合ったという事実にもかかわらず、Javaでどちらの方法がより良いアプローチであるかについての結論は出ませんでした。このトピックについてのあなたの意見は何ですか?どこに、そして最も重要なのは、なぜ、メインメソッドを配置した場所に配置するのですか?

36
kryoko

私はあなたの友達に同意します。複数のメインを持つ複数のプログラムで使用される可能性のある、再利用可能な可能性のあるサービスをAnImporterで構築しています。したがって、1つのメインを特別なものにして、それをAnImporterに埋め込むことはあまり意味がありません。

35
Clint Miller

できるだけ早くmainメソッドを使ってクラスから抜け出したいので、おそらくあなたの友達と一緒に行きたいと思います。アトミックにテストしたい場合(実行可能なクラスのみ)、またはモックアウトしたい場合に、テストを容易にするのに役立ちます。 mainメソッドから抜け出すのが早ければ早いほど、より多くのオプションがあります。 mainメソッドと他のものを含むクラスが1つあると、すぐに混乱する可能性があります。 (あなたが説明するような単純な例ではそのように見えないかもしれませんが)

しかし、可読性とテスト容易性は、メインメソッド(およびその包含クラス)からできるだけ早く抜け出すための2つの理由だと思います。しかしねえ..それは私だけです;)

14
digiarnie

Runnableクラスをmainメソッドで汚染することはありません。同じことが、アプリケーションで何かを行うほとんどすべてのクラスに当てはまります。通常、次のようなクラスがあります。

public class App {
  public static void main(String args[]) {
    Thread t = new Thread(new Blah());
    t.start();
      synchronized (t) {
        t.wait();
      }
  }
}

public class Blah implements Runnable {
  public void run() {
    // do normal stuff
  }
}

の代わりに:

public class Blah implements Runnable {
  public void run() {
    // do normal stuff
  }

  public static void main(String args[]) {
    Thread t = new Thread(new Blah());
    t.start();
    synchronized (t) {
      t.wait();
    }
  }
}

それはただきれいに感じます。

11
cletus

いくつかの理由から、私は常にメインを残りのコードから分離しています。

1)メインは、ある意味で、プログラムをコマンドラインから開始させるためのハックです。それを含むクラスには、単一の責任が必要です。プログラムをコマンドラインから開始させます。プライマリランナブルと一緒に置くことで、ランナブルを汚染していることになります。

2)複数のメインを持つことになりかねません(たとえば、特定のデフォルトパラメータ、特別なモードなど)

3)別の環境(EclipseプラグインまたはOGSIモジュール、アプレット、Webベースのツールなど)からプログラムを実行してしまう可能性があります。そのような場合は、メインへのアクセスを制限する必要があります。機能性を持たせることでそれを防ぎます。

4)実行時の実行を高速化するために、メインをデフォルトパッケージのままにしておく方が簡単な場合があります(たとえば、Java myblabla par1 par2 par3))が、残りの部分は絶対に必要ありません。デフォルトパッケージのコード。

7
Uri

Mainへのインターフェイス(文字列のリスト)は、OSシェルを除いてほとんど役に立ちません。

メインには、人間ができる限り少ないコードを含める必要があります。

確かに、あなたのpublic class ThisIsMyApp {...}は、他の場所にある実際の作業へのOSインターフェイスにすぎないはずです。

2
S.Lott

Mainメソッドをコードから分離します。

私も別のタイプのプロジェクトを持っていますが。これには、ソリューションの実際の作業プログラムは含まれていません。ここでは、同じライブラリを使用(および開発)して、さまざまな問題に対してさまざまなソリューションを実行する必要があります。さまざまな問題は並行していません。 IDEから1つの問題を単独で実行する必要があります。 PSVMメソッドを使用して膨大な数のクラスで同じプロジェクトを使用すると便利であることがわかりました。

このプロジェクトには、400を超えるさまざまな問題に対するプログラミングコンテストのソリューションが含まれています。あなたはこれのためのより良い組織を持っていますか?

0
kisp