奇了?关于静态内部类单例模式

各位大侠好,小弟最近写了一个spring读取配置文件的工具类,出现以下问题,希望各位不吝赐教~ 拜谢!

代码如下:

public class PropertieUtil {

    private static Properties properties;

    private PropertieUtil() {
        try {
            System.out.println("once");
            properties = PropertiesLoaderUtils
                    .loadAllProperties("parameter.properties");
        } catch (IOException e) {
        }
    }

    private static class PropertieUtilFactory {
        private static final PropertieUtil instance = new PropertieUtil();
    }

    @SuppressWarnings("static-access")
    public static String getPropertie(String key) {
        // 这种不加括号的报错:java.lang.NullPointerException,是因为没走构造函数,为什么不走构造函数呢??
        // return PropertieUtilFactory.instance.properties.getProperty(key);
        // 这种加括号的可以,为什么呢?
        return (PropertieUtilFactory.instance).properties.getProperty(key);
    }

}

 

首先,你的这种写法是不对的,static修饰的是跟实例无关的的属性和方法,而你把static属性的初始化放到构造方法里面本身是不对的,如果properties是跟实例是相关的,去掉static就可以了,如果不相关,则添加一段static代码块来初始化properties

再次,如果按照目前这样写的,以下只是我的理解,不一定正确
1. 不加括号,PropertieUtilFactory.instance.properties.getProperty(key);
因为properties是static的,前面的PropertieUtilFactory.instance仅仅表示这个方法所在的路径而不会做任何处理
2. 加括号 (PropertieUtilFactory.instance).properties.getProperty(key);
由于括号优先级高,编译时认为这里要用到PropertieUtilFactory.instance而对instance进行实例化,之后再访问properties

  1. 如果properties是实例属性,则与instance相关,需要初始化instance