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

问题描述

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

时间: 2024-09-20 00:19:21

奇了?关于静态内部类单例模式的相关文章

单例模式与静态类的区别及优势

有时候感觉单例模式与静态类的区别并不是那么明显,都是与数据无关的操作类,即整个过程不能太多的 数据依赖--更准确的说是对象依赖,最好是其只负责处理某一类型(传入的可以是接口)的对象,看看下面这 段代码: interface IPeople { string Name { set;} int Age { set; } string ToStringPeople(); } class PeopleServer { public PeopleServer() { } public void ToStr

《Android 源码设计模式解析与实战》——第2章,第2.6节单例模式的其他实现方式

2.6 单例模式的其他实现方式 2.6.1 懒汉模式 懒汉模式是声明一个静态对象,并且在用户第一次调用getInstance时进行初始化,而上述的饿汉模式(CEO类)是在声明静态对象时就已经初始化.懒汉单例模式实现如下. public class Singleton { private static Singleton instance; private Singleton () {} public static synchronized Singleton getInstance() { if

PHP单例模式静态类解析和实现源代码

为什么要使用PHP单例模式? 1.php的应用主要在于数据库应用.所以一个应用中会存在大量的数据库操作.使用单例模式.则可以避免大量的new 操作消耗的资源 2.如果系统中需要有一个类来全局控制某些配置信息.那么使用单例模式可以很方便的实现. 这个可以参看ZF的FrontController部分 3.在一次页面请求中.便于进行调试.因为所有的代码(例如数据库操作类db)都集中在一个类中.我们可以在类中设置钩子.输出日志.从而避免到处var_dump.echo 单例类 1.构造函数需要标记为pri

人人都会设计模式:02-单例子模式--Singleton

版权声明:本文为博主原创文章,未经博主允许不得转载 公众号:TigerChain 欢迎关注 教程简介 1.阅读对象 本篇教程适合新手阅读,老手直接略过 2.教程难度 初级,本人水平有限,文章内容难免会出现问题,如果有问题欢迎指出,谢谢 3.Demo 地址 https://github.com/githubchen001/DesignPattern 请看 SingleTon 部分 正文 一.什么是单例模式 1. 生活中的单例 一个男人只能有一个媳妇「正常情况」,一个人只能有一张嘴,通常一个公司只有

学习Java多线程之volatile域_java

前言 有时仅仅为了读写一个或者两个实例域就使用同步的话,显得开销过大,volatile关键字为实例域的同步访问提供了免锁的机制.如果声明一个域为volatile,那么编译器和虚拟机就知道该域是可能被另一个线程并发更新的.再讲到volatile关键字之前我们需要了解一下内存模型的相关概念以及并发编程中的三个特性:原子性,可见性和有序性. 1. java内存模型与原子性,可见性和有序性 Java内存模型规定所有的变量都是存在主存当中,每个线程都有自己的工作内存.线程对变量的所有操作都必须在工作内存中

单列模式

一.什么是单例模式 1. 生活中的单例 一个男人只能有一个媳妇「正常情况」,一个人只能有一张嘴,通常一个公司只有一个 CEO ,一个狼群中只有一个狼王等等 2.程序中的单例 一句话,就是保证一个类仅有一个实例即可「new 一次」,其实好多人都不把单例当作成一个设计模式,只是当作是一个工具类而已,因为它的确很简单,并且当你面视的时候面视官问你设计模式的时候估计都会说:可以说说你了解的设计模式吗「单例除外」.虽然很简单,但是我们还是要掌握和了解它,并且要深层次的了解它 单例模式的定义单例单例就是单一

scala实现单例模式

单例模式介绍 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例. 对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务:一个系统只能有一个窗口管理器或文件系统:一个系统只能有一个计时工具或ID(序号)生成器.如在Windows中就只能打开一个任务管理器.如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源:

如何正确地写出单例模式

单例模式算是设计模式中最容易理解,也是最容易手写代码的模式了吧.但是其中的坑却不少,所以也常作为面试题来考.本文主要对几种单例写法的整理,并分析其优缺点.很多都是一些老生常谈的问题,但如果你不知道如何创建一个线程安全的单例,不知道什么是双检锁,那这篇文章可能会帮助到你. 懒汉式,线程不安全 当被问到要实现一个单例模式时,很多人的第一反应是写出如下的代码,包括教科书上也是这样教我们的. public class Singleton { private static Singleton instan

减小内存的占用问题——享元模式和单例模式的对比分析

俗话说,自己写的代码,6个月后也是别人的代码--复习!复习!复习!总结的知识点如下: 享元模式概念和实现例子 使用了享元模式的Java API String类 java.lang.Integer 的 valueOf(int)方法源码分析 使用享元模式的条件 享元模式和单例模式的区别 前面的策略模式的话题提起了:如何解决策略类膨胀的问题,说到 "有时候可以通过把依赖于环境Context类的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用."换言之,可以使