어떤 혜택을 주(...)제공을 통해 사용하는 정적 이니셜라이저로 의사 entry-point?

StackOverflow https://stackoverflow.com/questions/1298342

문제

항점으로 프로그램에서 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 치료체에서 만들어진 정적 블록 다릅니다.

다른 어떤 혜택을에서 온 언어를 사용하여 정의 항목-point-public static void main(String args[])사용하는 대신 정체되 이니셜라이저입니다.

p.s.위의 조각이 그림,그리고되지 않을 수 있습 컴파일할 수 있는

도움이 되었습니까?

해결책

  • 테스트하거나 다른 응용 프로그램에서 호출 할 수 있습니다.
  • 다른 사람들이 기대하는 것입니다.
  • 정적 이니셜 라이저의 맥락에서 전체 응용 프로그램을 실행하면 의심하다 당신은 그 유형에 대한 잠금 장치를 항상 효과적으로 잡고있을 것입니다. 다른 스레드가 같은 클래스에서 정적 메소드를 호출하려고하면 차단됩니다. 그것은 당신이 예기치 않은 방식으로 개념을 사용하려고 할 때 얻는 일종의 문제입니다. 그것은 단지 개념적으로 "잘못된"일뿐입니다. 클래스를 초기화하는 것은 단순히 응용 프로그램을 실행하는 것과 다릅니다.

편집 : 다음은 그 문제의 예입니다.

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 새 스레드에서 정적 이니셜 라이저가 실행되기 전에 끝날 때까지 기다려야합니다.

다른 팁

전화해도됩니다 main() 코드의 다른 곳에서 다른 객체의 경우 원하는만큼 여러 번. 정적 이니셜 라이저는 한 번만 실행됩니다. 또한 명령 줄에서 매개 변수를 전달할 수 있습니다. main().

두 개의 큰 플러스 main() 내 책에서.

사용하는 것이 더 나은 주된 이유입니다 main() 응용 프로그램에 다른 클래스에서 몇 가지 주요 방법을 가질 수 있다는 것입니다. 수업을로드하면 main() 자동으로 실행되지 않습니다 static 코드 블록은 클래스가 처음로드 될 때 항상 정확히 한 번 실행되며이를 방지 할 방법이 없습니다.

좋아, 나는 정적 초기화 된 클래스로 그것을 시도하지 않았지만 입력하지 않을 것임을 인정할 것이다.

java StaticInitializedClass

명령 줄에 인쇄

Exception in thread "main" java.lang.NoSuchMethodError: main

그것은 없기 때문에 main(String[]) 방법?

유지 관리에 대해 잊지 마십시오. 다른 사람이 코드를 변경하려면 항상 프로그램을 시작하기위한 메인 () 메소드를 찾습니다. 당신이 돌아 다닐 수없는 이유가 없다면 (그리고 나는 없다고 생각합니다), 나는 단지 주요 방법을 사용할 것입니다.

이 없으면 모든 항목에 포인트를 실행할 수 없습니다.이 많은 경우 항목이 포인트(많은 주요 방법),시작하는 사용자가 응용 프로그램 컨트롤하는 것이 실행해서 명령 라인입니다.
다른 한편으로 정적 블록을 초기화가 실행되는 경우 등이 로드됩니다.을 제어하는 클래스를 로드리고의 순서는 클래스 로딩(고 실행하는 정적들의 블록을 초기화)가 훨씬 어렵습니다.는 충분하지 않을 이유에 넣어 많은 논리로 정적 블록을 초기화.당신이 무언가 열심히 읽고 이해하고 당신을 보상을 받게 무언가를 열심히 사용합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top