只是为了补充一些已经很不错的观点。静态初始化程序是线程安全的。它在加载类时执行,从而使静态数据初始化比使用构造函数更简单,在构造函数中,您将需要一个同步块来检查静态数据是否已初始化,然后进行实际初始化。
public class MyClass {
static private Properties propTable;
static
{
try
{
propTable.load(new FileInputStream("/data/user.prop"));
}
catch (Exception e)
{
propTable.put("user", System.getProperty("user"));
propTable.put("password", System.getProperty("password"));
}
}
与
public class MyClass
{
public MyClass()
{
synchronized (MyClass.class)
{
if (propTable == null)
{
try
{
propTable.load(new FileInputStream("/data/user.prop"));
}
catch (Exception e)
{
propTable.put("user", System.getProperty("user"));
propTable.put("password", System.getProperty("password"));
}
}
}
}
别忘了,您现在必须在类而不是实例级别进行同步。这将为每个构造的实例产生一个成本,而不是在加载类时产生一次成本。另外,这很丑;-)