特典にはどのようなものがありがメイン(...)を超え用の静的初期化子としての擬似エントリポイント?
-
18-09-2019 - |
質問
のエントリポイントへのプログラムをjavaでは、通常、このようになっ
// MyMain.java
public class MyMain{
//whatever
public static void main(String args[]){
System.out.println("balderdash");
}
}
しかし、あのSOPをメインに、上記のクラスはこのような
// MyMain.java
public class MyMain{
//whatever
static {
System.out.println("balderdash");
}
}
で利用メイン(...)をこの引数が渡されます。を行います。うんこちら推測していいのゴミcollecter処理で作成したオブジェクト内の静ブロックとは異なります。
他の特典からの用語の定義のエントリポイント-public static void main(String(<%=args%>等:args[])を使用static初期化子.
p.s.上記のスニペットはイラストのみが行うことはできませんcompilable
解決
- できる試験では電話をして他のアプリケーションから.
- これが他の人にします。
- 実行すれば全体の文脈のstatic初期化子、 容疑者 しょう効果的にできるロックアプローチを採用。場合、その他のスレッドを呼びstaticメソッドと同じクラスでブロックです。そのような問題だときに利用するようにしてコンセプトに、思わぬところで役に立ち"でよろしいでしょうかを概念的に"間違った".を初期化するクラスでできないのではないでして他のアプリケーションに対す.
編集:以下に例を示しますの問題:
class SampleTask implements Runnable
{
public void run()
{
System.out.println("Calling someStaticMethod");
Test.someStaticMethod();
System.out.println("someStaticMethod returned");
}
}
public class Test
{
static
{
System.out.println("Starting new thread...");
new Thread(new SampleTask()).start();
System.out.println("Thread started. Sleeping");
try
{
Thread.sleep(5000);
}
catch (InterruptedException e)
{
System.out.println("Interrupted!");
}
System.out.println("Finished sleeping");
}
public static void someStaticMethod()
{
System.out.println("In someStaticMethod");
}
public static void main(String[] args)
{
System.out.println("In main. Sleeping again.");
try
{
Thread.sleep(5000);
}
catch (InterruptedException e)
{
System.out.println("Interrupted!");
}
}
}
出力:
Starting new thread...
Thread started. Sleeping
Calling someStaticMethod
Finished sleeping
In someStaticMethod
someStaticMethod returned
In main. Sleeping again.
注どのように呼 someStaticMethod
からの新しいスレッドでは、static初期化子が終了する前に取得します。
他のヒント
あなたは何度でもどこか他のあなたのコード内から他のオブジェクトのmain()
を呼び出すことができます。静的初期化子は今まで一度に実行しようとしています。また、あなたはmain()
に、コマンドラインからパラメータを渡すことができます。
私の本の中でmain()
ための二つの大きなplussesます。
それはmain()
を使用することをお勧めします主な理由は、(別のクラスで)あなたのアプリケーションのいくつかの主要なメソッドを持つことができるということです。あなたがクラスをロードした場合main()
コードブロックは常にクラスがロードされた最初の時点で一度だけ実行して、それを防ぐための方法はありませんしている間、static
が自動的に実行されません。
OK、私は、静的な初期化クラスでそれを試していないことを認めるよ、しかし入力しないでしょう。
java StaticInitializedClass
コマンドラインでプリントアウト
Exception in thread "main" java.lang.NoSuchMethodError: main
それはmain(String[])
メソッドを持っていないので、?
のは、保守性を忘れないようにしましょう。他の誰かがあなたのコードを変更することになると、彼らは常に、プログラムを開始するにはmain()メソッドを探ししようとしています。あなたが周りを取得することはできません(と私はそこではありません推測している)、いくつかの理由がない限り、私はちょうどmainメソッドを使用することになります。
、あなたは何を実行することはできません。あなたは多くのエントリポイント(多くの主な方法を)持っている場合、ユーザーは、コマンドラインで実行されるアプリケーションのコントロールを開始し、誰。
クラスがロードされたときに一方の静的初期化ブロックが実行されます。ロードされたクラスローディングの順序(およびそれらの静的初期化ブロックの実行)されているクラスの制御は、制御することがはるかに困難です。これは、静的な初期化ブロックに多くのロジックに置くのに十分な理由です。あなたは読んで理解しにくい何かを作ると報酬にあなたは使用が困難なものを受け取ります。