Art*_*tem 41 java coding-style static-initializer
什么是最好,最干净的方法?具体来说,我需要静态初始化程序块中的一些代码才能在该类中运行,但我希望尽可能使它看起来更干净.
L̲̳*_*̲̳̳ 47
正在加载!=初始化.
您希望初始化您的类(这是在执行静态块时).
Java语言规范的摘录说:
类或接口类型T将在第一次出现之前立即初始化>以下任何一个:
- T是一个类,并且创建了T的实例.
- T是一个类,并且调用由T声明的静态方法.
- 分配由T声明的静态字段.
- 使用由T声明的静态字段,该字段不是常量变量(第4.12.4节).
- T是顶级类,并且执行在词典内嵌套在T中的断言语句(第14.10节).
在类Class和包java.lang.reflect中调用某些反射方法也会导致类或接口初始化.在任何其他情况下,不会初始化类或接口.
Doh,anovstrup,已经说过:只需要调用一个空的静态函数init.一定要记录好...我个人在格式良好的代码的上下文中看不到任何用例.
小智 16
您可以使用以下代码强制初始化类:
//... Foo.class ... //OLD CODE
... forceInit(Foo.class) ... //NEW CODE
/**
* Forces the initialization of the class pertaining to
* the specified <tt>Class</tt> object.
* This method does nothing if the class is already
* initialized prior to invocation.
*
* @param klass the class for which to force initialization
* @return <tt>klass</tt>
*/
public static <T> Class<T> forceInit(Class<T> klass) {
try {
Class.forName(klass.getName(), true, klass.getClassLoader());
} catch (ClassNotFoundException e) {
throw new AssertionError(e); // Can't happen
}
return klass;
}
Run Code Online (Sandbox Code Playgroud)
try
{
Class.forName(class name as string)
}
catch(ClassNotFoundException e)
{
whatever
}
Run Code Online (Sandbox Code Playgroud)
应该这样做.
@Longpoke
也许我误解了一些事情.你能创建一个加载类但是不执行静态初始化程序的例子吗?这是一个示例,除了打印出已加载之外什么都不做:
package test;
public class TestStatic
{
public static void main(String[] args)
{
try
{
Class.forName("test.Static");
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
加载以下静态类:
package test;
public class Static
{
static
{
System.out.println("Static Initializer ran...");
}
}
Run Code Online (Sandbox Code Playgroud)
如果在您列出的条件满足之前没有运行静态初始值设定项,那么为什么在运行测试时这个println会被执行?那是我遇到的哪些条件?