代码之家  ›  专栏  ›  技术社区  ›  Everyone

对于将静态初始值设定项用作伪入口点,main(…)提供了哪些好处?

  •  2
  • Everyone  · 技术社区  · 17 年前

    进入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");
            }
        }
    
    

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

    使用语言定义的入口点-public static void main(string args[])而不是使用静态初始值设定项还有什么好处。

    P.S.以上代码段仅供说明,不可编译。

    6 回复  |  直到 17 年前
        1
  •  6
  •   Jon Skeet    17 年前
    • 您可以测试它,也可以从其他应用程序调用它。
    • 这是别人所期待的。
    • 如果在静态初始值设定项的上下文中执行整个应用程序,则 犯罪嫌疑人 你会一直紧盯着那个类型。如果其他线程试图调用同一类中的静态方法,它将阻塞。当你试图以一种意想不到的方式使用一个概念时,你会遇到这样的问题——这只是概念上的“错误”。初始化类与运行应用程序不同。

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

    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 新线程必须等待静态初始值设定项完成后才能运行。

        2
  •  5
  •   banjollity    17 年前

    你可以打电话 main() 对于代码中其他任何地方的其他对象,可以根据需要多次执行。静态初始值设定项只能运行一次。此外,还可以将参数从命令行传递到 主体() .

    两大优点 主体() 在我的书里。

        3
  •  2
  •   Aaron Digulla    17 年前

    最好使用的主要原因 main() 在应用程序中(在不同的类中)可以有几个主要的方法。如果你上了课, 主体() 在以下情况下不会自动执行 static 代码块总是在第一次加载类时执行一次,并且没有办法防止这种情况发生。

        4
  •  2
  •   Powerlord    17 年前

    好吧,我承认我还没有用静态初始化类来尝试过,但是不会打字

    java StaticInitializedClass
    

    在命令行上打印输出

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

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

        5
  •  1
  •   Ben    17 年前

    我们不要忘记可维护性。当其他人更改代码时,他们总是会寻找一个main()方法来启动程序。除非有什么原因你不能到处走动(我猜没有),否则我只使用主要方法。

        6
  •  0
  •   Tadeusz Kopec for Ukraine yespbs    17 年前

    如果没有任何入口点,则无法运行任何内容。如果您有许多入口点(许多主要方法),则启动应用程序的用户控制将通过命令行运行。
    另一方面,静态初始化块在加载类时执行。控制加载的类和类加载的顺序(以及执行静态初始化块的顺序)更难控制。这是不向静态初始化块添加太多逻辑的足够理由。你让一些东西更难阅读和理解,而作为回报,你会得到一些更难使用的东西。

    推荐文章