什么样的好处不会主要(...)提供在使用静-初始化作为一个伪入境点?
-
18-09-2019 - |
题
入口点进入一个程序在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");
}
}
一个明显的优势,使用的主要(...),论点可以通过的程序。另一个(我猜这里)可能需要做的垃圾收集器治疗的对象内创建一个静态块不同。
什么其他好处来自使用语的定义入境点的公共则(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
代码块总是执行一次在第一时间一级的装载和没有办法阻止。
OK,我承认,我没有用静态初始化类试了一下,但不会打字
java StaticInitializedClass
在命令行上打印出
Exception in thread "main" java.lang.NoSuchMethodError: main
,因为它不具有main(String[])
方法?
让我们不要忘了可维护性。当别人去改变你的代码,他们总是要寻找一个main()方法来启动程序。除非有某种原因,你不能得到解决(我猜没有),那么我只是将使用的主要方法。
如果你没有任何入境点,你不能运行任何东西。如果你有许多切入点(许多主要方法),用户开始你的应用程序的控制,这将由运行命令行。
另一方面静态的初始化块时执行类装载。控制这类装和秩序的类装卸(及执行它们的静初始化块)是更难控制。这就是足够的原因,不要把太多的逻辑静初始化块。你做出的东西更难于阅读和理解和奖励,你收到的东西更难以使用。