shuqi491083009 2014-12-12 15:40
浏览 406
已采纳

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

各位大侠好,小弟最近写了一个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);
    }

}
  • 写回答

1条回答 默认 最新

  • lihen123 2014-12-13 18:01
    关注

    首先,你的这种写法是不对的,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
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图