java - 与使用静态初始化器作为伪入口点相比,main(...) 有什么好处?

标签 java static-initializer entry-point

Java 程序的入口点通常是这样的


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

但是,由于main中只有一个SOP,所以上面的类可能是这样的


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

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

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

附注以上片段仅供引用,可能无法编译

最佳答案

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

编辑:这是该问题的示例:

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 必须等到静态初始化器完成后才能运行。

关于java - 与使用静态初始化器作为伪入口点相比,main(...) 有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1298342/

相关文章:

python - 如何定义一个函数作为包入口点?

java - 使用 ph-schematron 时解析相对路径

java - Spring LDAP 和 Spring Boot 配置

java - Java 中的静态/实例初始化程序 block 按什么顺序运行?

c# - delphi 导入具有指定入口点的dll函数

qt - .exe无法通过QtCreator和Qt 4.8.1的外部运行。关于dll的问题

java - 一个将继续运行的线程?

java - Eclipse 工作区已损坏

java - 为什么静态初始化程序允许在 Java 中重新初始化静态变量?

java静态初始化器被调用两次