0 0

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

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

}

 

2014年12月12日 15:40

1个答案 按时间排序 按投票排序

0 0

采纳的答案

首先,你的这种写法是不对的,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

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

2014年12月13日 18:01

相关推荐

    Java单例模式实现静态内部类方法示例

    "Java单例模式实现静态内部类方法示例" Java单例模式是软件设计模式中最基本和最常见的一种设计模式,也是最容易理解的一种设计模式。它的主要思想是确保某个类只有一个实例,并且提供一个全局访问点来访问该实例。...

    java单例设计模式 4中实现方式,重点介绍了静态内部类的实现方式

    静态内部类单例模式利用了Java语言中静态内部类的特性来实现单例模式。具体来说它将单例对象的创建延迟到静态内部类被加载时才执行,从而避免了多线程环境下的同步问题。下面是一个简单的示例代码: ```java public...

    设计模式之单例模式(结合工厂模式)

    此外,单例模式还有几种变体,比如静态内部类单例和枚举单例。静态内部类单例利用Java类加载机制保证了线程安全,而枚举单例则是Java中实现单例的最佳方式,因为它天然支持序列化且防止反射攻击。 在代码实现上,...

    Java 单例模式 工具类

    Java中的单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供全局访问点。在Java编程中,单例模式常用于控制资源的访问,比如数据库连接池、线程池或者日志对象等。本篇文章将深入探讨如何在Java中...

    设计模式——单例模式

    2. **静态内部类单例模式** ```java public class Singleton { private Singleton() {} private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } public ...

    这可能是最全的单例模式了

    静态内部类实现单例模式5. 饿汉实现单例模式6. 饿汉变种实现单例模式7. 枚举实现单例模式static修饰下是怎么做到线程安全的?完全不使用synchronized实现单例模式1. CAS(AtomicReference)实现单例模式2. ...

    java单例模式实例

    单例模式是软件设计模式中的一种经典模式,用于确保一个类只有一个实例,并提供一个全局访问点。在Java中,有多种实现单例模式的方法,每种都有其特点和适用场景。接下来,我们将深入探讨这些实现方式。 首先,我们...

    设计模式之单例模式源码demo

    4. **静态内部类单例模式**:利用Java类加载机制保证初始化实例时只有一个线程,避免了同步问题。同时,由于静态内部类不会随着外部类的加载而加载,所以也实现了延迟初始化。 ```java public class Singleton { ...

    浅谈内部类与静态内部类的应用

    成员内部类适合处理需要紧密关联的情况,而静态内部类则适用于实现工具类或辅助功能,并且在单例模式中有独特的优势。理解并恰当运用这两种内部类,能够提升代码的效率和可维护性,是Java程序员进阶的必修技能。

    7种单例模式

    5. **静态内部类单例**: 利用类加载机制保证单例,既延迟初始化,又线程安全。 ```java public class Singleton { private Singleton() {} private static class SingletonInstance { private static final ...

    Java静态内部类实现单例过程

    总结来说,静态内部类实现的单例模式具有延迟加载和线程安全的优点,适用于需要控制初始化时机的情况。而枚举实现的单例则更加简洁,天生线程安全,但不支持延迟加载,适用于初始化开销不大且不需要延迟加载的场景。...

    Java-设计模式-单例模式-实现源码(简单实现、双重检查锁、静态内部类、枚举类)

    在Java中,有多种实现单例模式的方法,包括简单实现、双重检查锁定(Double-Checked Locking)、静态内部类和枚举类。下面我们将详细探讨这些不同的实现方式。 1. **简单实现(非线程安全)** 最简单的单例实现...

    设计模式单例模式

    单例模式是软件设计模式中的一种基础且广泛应用的模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在系统中需要频繁创建和销毁对象,且对象创建成本较高,或者需要共享资源的情况下非常...

    QT静态单例管理信号和槽

    单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点。在Qt中,我们通常使用静态成员函数来实现单例,确保任何时候都只能通过这个函数创建或获取该类的实例。 创建Qt静态单例的典型步骤...

    几种单例模式demo

    单例模式是软件设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,比如控制资源的唯一性、管理共享配置或者创建昂贵的对象时避免频繁创建销毁。 ...

    java中的单例模式

    单例模式的基本思想是确保一个类在任何情况下都只有一个实例,并提供一个全局访问点来获取这个唯一的实例。这样可以避免因为创建多个实例导致的资源浪费和状态不一致的问题。 在Java中,实现单例模式主要有两种方式...

    单例模式.ppt

    【单例模式】是一种常用的软件设计模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。在软件开发中,单例模式常用于管理共享资源或者需要协调多个组件交互的场景,比如数据库连接池、日志服务等。 ...

Global site tag (gtag.js) - Google Analytics