JAVA Static方法与单例模式的理解
近期用sonar測评代码质量的时候,发现一个问题,project中一些util类,曾经写的static方法都提示最好用单例的方式进行改正。
为此,我细致想了想,发现还是非常有道理的。这里谈谈我个人对static方法与单例模式的理解。
所谓单例模式,我不做过多解释,推荐java设计模式之禅这本书,好好理解一下。
这里我谈谈两种写法:
曾经一些公共的类,我不假思索,习惯依照例如以下写法去写:
| public class DateUtil {
public final static String DATEFORMAT = "YYYY-MM-DD"; private DateUtil() { } } |
调用的时候直接DateUtil.changeDateFormat();
假设希望这个类作为一个单例,OK,能够直接在方法里加入一个私有的构造方法。
这样一来,既能够避免用户new一个对象,又能够实现方法的调用,看似非常好。
事实上,这样的做法最大的缺点就是static作为一个静态方法,在载入类的时候就被载入到内存中,无论你用不用都占用这个位置,这样的设计是不推荐的。
而採用单例模式的写法非常好的攻克了这个问题,例如以下:
| public class DateUtil {
public final String DATEFORMAT = "YYYY-MM-DD"; private DateUtil() { } private static Integer LOCK = 0; public static DateUtil getInstance() { public void changeDateFormat() { } |
相同,这样的方式能够确保用户仅仅能获取一个实例,符合单例的设计思想。
同一时候,仅仅有在用这个实例调用方法的时候,方法才被加入到内存中,当对象不用的时候,gc会将方法回收,效率高了非常多,当然我这里构建的单例是线程安全的。
简介到这里,假设对JAVA内存感兴趣的能够看我之前的文章,这里还要推荐还有一个兄弟的,链接发上:
1.http://blog.csdn.net/hongshan50/article/details/40583875
2.假设对static方法和普通方法占用JAVA内存感兴趣的,看以下这篇:
http://blog.sina.com.cn/s/blog_4fe01e630100g775.html
JAVA Static方法与单例模式的理解的更多相关文章
- java static 方法使用笔记
有入参的static方法,可以正常使用 static的作用是申明:这是类的静态方法,什么时候都可以调用,可以传入入参,也可以不传. 上代码: 1.带静态方法的类: public class MakeP ...
- java static方法不能被重写@Override
重写方法的目的是为了多态,或者说:重写是实现多态的前提,即重写是发生在继承中且是针对非static方法的. 语法上子类允许出现和父类只有方法体不一样其他都一模一样的static方法,但是在父类引用指向 ...
- java——多线程——单例模式的static方法和非static方法是否是线程安全的?
单例模式的static方法和非static方法是否是线程安全的? 答案是:单例模式的static方法和非static方法是否是线程安全的,与单例模式无关.也就说,如果static方法或者非static ...
- JAVA设计模式 1 设计模式介绍、单例模式的理解与使用
数据结构我们已经学了一部分了.是该了解了解设计模式了.习惯了CRUD的你,也该了解了解这一门神器.我为啥要说是神器呢? 因为在大厂的面试环节.以及很多的比如 Springboot Mybatis 等开 ...
- JAVA中的static方法
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何 ...
- 深入理解Java中方法的参数传递机制
形参和实参 我们知道,在Java中定义方法时,是可以定义参数的,比如: public static void main(String[] args){ } 这里的args就是一个字符串数组类型的参数. ...
- Java 反射理解(三)-- Java获取方法信息
Java 反射理解(三)-- Java获取方法信息 基本的数据类型.void关键字,都存在类类型. 举例如下: public class ClassDemo2 { public static void ...
- Java中synchronized 修饰在static方法和非static方法的区别
[问题描述]关于Java中synchronized 用在实例方法和对象方法上面的区别 [问题分析]大家都知道,在Java中,synchronized 是用来表示同步的,我们可以synchronized ...
- java static 变量,和方法从属于类
第36集 java static 变量,和方法从属于类 可以用类来直接调用static属性和方法 static方法不能调用非静态的属性和方法,反之可以 new产生的对象,不包括static 属性和方法
随机推荐
- Android尽量避免使用开发jpg图片
因为jpgeasy失真,因此,Android尽量避免使用开发.jpg图片,相反,使用.png图片,它使用LZ77衍生无损数据压缩算法. 事实上在这一点上,Google他已经暗示我们: 发现了没有,在r ...
- Cocos2d-X 使用CCTableView创建滚动视图
CCTableView和CCScrollView如创建滚动视图,CCTableView该函数将是更,制造更多麻烦 实例1:使用CCTableView创建滚动视图 首先创建一个TableView类 Ta ...
- java使用Base64编码和解码的图像文件
1.编码和解码下面的代码示例看: import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import j ...
- Java常见Exception物种
Java常见Exception物种 1.ClassNotFoundException 2.IOException 3.NoSuchFieldException 4.NoSuchMethodExcept ...
- 左右sqlplus一些方法用于汇总
SQL> select * from v$version where rownum=1; BANNER --------------------------------------------- ...
- Dapper的使用
轻量型ORM框架Dapper的使用 /// <summary> /// 查询操作 /// </summary> /// <typeparam name="T&q ...
- leetcode-2 Add Two Numbers 计算两个对应的列表和问题
1.问题描写叙述: You are given two linked lists representing two non-negativenumbers. The digits are sto ...
- OCEANIAERP对接-code盘点机并存储实时库存计划和方案的使用,实时库存,云清查方案
1. PDA手持设备按键说明 [Tab]键:使输入焦点在控件上切换. [ESC]键:弹出是否退出确认对话框,退出操作界面或程序. [OK]键:确认输入或选择,进入下一步操作. [C]键:删除键 ...
- hdu 3081 hdu 3277 hdu 3416 Marriage Match II III IV //灵活运用最大流量
3081 意甲冠军: n女生选择不吵架,他甚至男孩边(他的朋友也算.并为您收集过程).2二分图,一些副作用,有几个追求完美搭配(每场比赛没有重复的每一个点的比赛) 后.每次增广一单位,(一次完美匹配) ...
- WPF学习(8)数据绑定
说到数据绑定,其实这并不是一个新的玩意儿.了解asp.net的朋友都知道,在asp.net中已经用到了这个概念,例如Repeater等的数据绑定.那么,在WPF中的数据绑定相比较传统的asp.net中 ...