Java单例模式实现静态内部类方法示例
作者:ZzzCrazyPig 发布时间:2021-08-03 00:36:51
标签:java,单例,静态内部类
Singleton是众多设计模式中最容易理解的一种,也是众多设计模式中较为重要的一种设计模式。接下来我们看看具体介绍。
Singleton模式实现的重点在于将构造函数私有化(private),并通过提供静态公有函数(public synchronized static xxx getInstance)来获取定义在类中的静态私有成员(private static xxx instance),通过一个简单的判断静态实例是否为空来控制这个类只能够new一次,即控制了一个类只能有单个实例,一般的实现如下代码所示:
package com.study.dp.singleton;
/**
* 传统方式实现单例模式
* @author CrazyPig
*
*/
public class TraditionalSingletion {
// 单实例
private static TraditionalSingletion instance;
// 不让new
private TraditionalSingletion() {
System.out.println("private TraditionalSingletion()");
}
public synchronized static TraditionalSingletion getInstance() {
System.out.println("TraditionalSingletion getInstance()");
if(instance == null) {
System.out.println("instance = new TraditionalSingletion()");
instance = new TraditionalSingletion();
}
return instance;
}
public static void main(String[] args) {
TraditionalSingletion instance = TraditionalSingletion.getInstance();
System.out.println("========================================");
TraditionalSingletion instance01 = TraditionalSingletion.getInstance();
System.out.println("========================================");
TraditionalSingletion instance02 = TraditionalSingletion.getInstance();
}
}
今天偶然在一篇文章中看到另外一种巧妙的做法,通过将这个单实例的引用变量定义在静态内部类中,来实现单例,这样可以做到不用if条件进行判断,并且是多线程安全的(由jvm保证)。这个特殊的做法如下所示:
package com.study.dp.singleton;
/**
* 静态内部类实现单例模式
* @author CrazyPig
*
*/
public class SpecialSingleton {
// 静态内部类
private static class NestClass {
private static SpecialSingleton instance;
static {
System.out.println("instance = new SingletonTest()");
instance = new SpecialSingleton();
}
}
// 不能直接new
private SpecialSingleton() {
System.out.println("private SingletonTest()");
}
public static SpecialSingleton getInstance() {
System.out.println("SingletonTest getInstance()");
return NestClass.instance;
}
public static void main(String[] args) {
SpecialSingleton instance = SpecialSingleton.getInstance();
System.out.println("========================================");
SpecialSingleton instance01 = SpecialSingleton.getInstance();
System.out.println("========================================");
SpecialSingleton instance02 = SpecialSingleton.getInstance();
}
}
当第一次引用getInstance()方法的时候,访问静态内部类中的静态成员变量,此时该内部类需要调用static代码块(因为首次访问该类)。而后再次访问getInstance()方法会直接返回instace引用。这种做法相对于传统做法更加巧妙。
来源:http://blog.csdn.net/d6619309/article/details/38655825
0
投稿
猜你喜欢
- 前言最近在刷java面试题偶然看到这类问题(try/finally中含有return时的执行顺序),觉得挺有意思于是小小的研究了一下,希望经
- 一、前言首选,双轴快排也是一种快排的优化方案,在JDK的Arrays.sort()中被主要使用。所以,掌握快排已经不能够满足我们的需求,我们
- 本文实例为大家分享了java动态导出excel压缩成zip下载的具体代码,供大家参考,具体内容如下package pack.java.io.
- 1、JDBCJDBC 就是 数据库开发 操作的 代名词,因为只要是现代商业项目的开发那么一定是离不开 数据库 的,不管你搞的是什么,只要是想
- 开篇语Synchronized,Java 友好的提供了的一个关键字,它让开发者可以快速的实现同步。它就像一个星星,远远看去就是一个小小的点。
- Java中为什么需要Callable在java中有两种创建线程的方法:一种是继承Thread类,重写run方法:public class T
- 1.引入如下依赖<dependency> <groupId>org.spri
- 概述:Flutter中常用的滑动布局 ScrollView 有 SingleChildScrollView、NestedScrollView
- 一、静态静态的定时任务可以直接使用注解@Scheduled,并在启动类上配置@EnableScheduling即可@PostMapping(
- Java中的static关键字可以用于修饰变量、方法、代码块和类,还可以与import关键字联合使用,使用的方式不同赋予了static关键字
- 部分同学在使用 idea 时可能会遇到输入 sout 无法出现自动补全 System.out.println();的情况,其实 idea 默
- 这篇文章主要介绍了SPRING IOC注入方式过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 一.MyBatis简介1)MyBatis 是一款优秀的持久层框架2)MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结
- Knn算法的核心思想是如果一个样本在特征空间中的K个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性
- 前提:① 已经提供了一个wsdl接口② 该接口能正常调用总体分为两种方式:1.使用cxf的wsdl2java工具生成本地类(使用方式就是本地
- Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,
- 定义:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。类型:行为类
- ShardingSphere的路由引擎类型本篇文章源码基于4.0.1版本上篇文章我们了解到了ShardingSphere在路由流程过程中,根
- 本文实例讲述了C#编程实现自定义热键的方法。分享给大家供大家参考。具体实现方法如下:using System;using System.Co
- 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把