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

时间:2009-08-19 07:41:29

标签: 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(...)的一个明显优势是参数可以传递给程序。 另一个(我在这里猜测)可能与垃圾收集器有关,不同地处理在静态块中创建的对象。

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

P.S。上述代码段仅供参考,可能无法编译

6 个答案:

答案 0 :(得分: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!");
        }
    }
}

输出:

Starting new thread...
Thread started. Sleeping
Calling someStaticMethod
Finished sleeping
In someStaticMethod
someStaticMethod returned
In main. Sleeping again.

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

答案 1 :(得分:5)

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

我书中main()的两大优点。

答案 2 :(得分:2)

使用main()更好的主要原因是您可以在应用程序中使用几种主要方法(在​​不同的类中)。如果加载一个类,main()不会自动执行,而static代码块在第一次加载类时总是执行一次,并且无法阻止它。

答案 3 :(得分:2)

好的,我承认我没有尝试过静态初始化类,但不会输入

java StaticInitializedClass
命令行上的

打印出来

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

因为它没有main(String[])方法?

答案 4 :(得分:1)

我们不要忘记可维护性。当其他人去改变你的代码时,他们总是会寻找一个main()方法来启动程序。除非有某些原因你无法绕过(而我猜不会),那么我只会使用main方法。

答案 5 :(得分:0)

如果您没有任何入口点,则无法运行任何操作。如果您有许多入口点(许多主要方法),启动应用程序控制的用户将通过命令行运行 另一方面,在加载类时执行静态初始化块。控制加载哪个类以及类加载(以及执行其静态初始化块)的顺序更难控制。这足以让不对静态初始化块施加太多逻辑。你创造了一些难以阅读和理解的东西,并且在奖励中你会收到更难以使用的东西。