问题描述
各位大侠好,小弟最近写了一个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进行实例化,之后再访问properties3. 如果properties是实例属性,则与instance相关,需要初始化instance