main(...)提供了使用静态初始化程序作为伪入口点的哪些好处?

Eve*_*one 2 java entry-point static-initializer

java中程序的入口点通常是这样的


    // MyMain.java
    public class MyMain{  
      //whatever 
        public static void main(String args[]){ 
        System.out.println("balderdash");
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是,由于main中只有一个SOP,因此上述类可能是这样的


    // MyMain.java
    public class MyMain{
        //whatever
        static {    
        System.out.println("balderdash");
        }
    }

使用main(...)的一个明显优点是参数可以传递给程序.另一个(我在这里猜测)可能与垃圾收集器有关,不同地处理在静态块中创建的对象.

使用语言定义的入口点还有其他好处 - public static void main(String args [])而不是使用静态初始化程序.

ps上述代码段仅供参考,可能无法编译

Jon*_*eet 6

  • 您可以测试它或从其他应用程序调用它.
  • 这是其他人所期望的.
  • 如果您在静态初始化程序的上下文中执行整个应用程序,我怀疑您将在整个时间内有效地锁定该类型.如果任何其他线程试图在同一个类中调用静态方法,它将阻塞.当你试图以一种意想不到的方式使用一个概念时,这就是你遇到的那种问题 - 它只是在概念上"错误".初始化类与运行应用程序不同.

编辑:这是一个问题的例子:

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!");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

Starting new thread...
Thread started. Sleeping
Calling someStaticMethod
Finished sleeping
In someStaticMethod
someStaticMethod returned
In main. Sleeping again.
Run Code Online (Sandbox Code Playgroud)

请注意someStaticMethod来自新线程的调用必须等到静态初始化程序在运行之前完成.

  • JLS的第12.4.2节另有说明.将尝试拿出一个例子. (3认同)

ban*_*ity 5

您可以main()根据需要多次从代码中的任何其他位置调用其他对象.静态初始化程序只会运行一次.此外,您可以将命令行中的参数传递给main().

main()在我的书中有两个大的优点.

  • @Everyone:对于每个简单的解决方案,都有无数复杂的解决方案.;) (4认同)
  • 另一大优点:每个java程序员都清楚地知道带有main方法的类是可执行的.静态初始化器是一种混淆. (3认同)