JAVA Static方法与单例模式的理解
2014-11-03 16:40
274 查看
最近用sonar测评代码质量的时候,发现一个问题,工程中一些util类,以前写的static方法都提示最好用单例的方式进行改正。
为此,我仔细想了想,发现还是很有道理的。这里谈谈我个人对static方法与单例模式的理解。
所谓单例模式,我不做过多解释,推荐java设计模式之禅这本书,好好理解一下。
这里我谈谈两种写法:
以前一些公共的类,我不假思索,习惯按照如下写法去写:
调用的时候直接DateUtil.changeDateFormat();
如果希望这个类作为一个单例,OK,可以直接在方法里添加一个私有的构造方法。
这样一来,既可以避免用户new一个对象,又可以实现方法的调用,看似很好。
其实,这种做法最大的缺点就是static作为一个静态方法,在加载类的时候就被加载到内存中,不管你用不用都占用这个位置,这种设计是不推荐的。
而采用单例模式的写法很好的解决了这个问题,如下:
同样,这种方式可以确保用户只能获取一个实例,符合单例的设计思想。
同时,只有在用这个实例调用方法的时候,方法才被加入到内存中,当对象不用的时候,gc会将方法回收,效率高了很多,当然我这里构建的单例是线程安全的。
简单介绍到这里,如果对JAVA内存感兴趣的可以看我之前的文章,这里还要推荐另一个兄弟的,链接发上:
1.http://blog.csdn.net/hongshan50/article/details/40583875
2.如果对static方法和普通方法占用JAVA内存感兴趣的,看下面这篇: http://blog.sina.com.cn/s/blog_4fe01e630100g775.html
为此,我仔细想了想,发现还是很有道理的。这里谈谈我个人对static方法与单例模式的理解。
所谓单例模式,我不做过多解释,推荐java设计模式之禅这本书,好好理解一下。
这里我谈谈两种写法:
以前一些公共的类,我不假思索,习惯按照如下写法去写:
public class DateUtil { public final static String DATEFORMAT = "YYYY-MM-DD"; private DateUtil() { } public static void changeDateFormat() { } } |
如果希望这个类作为一个单例,OK,可以直接在方法里添加一个私有的构造方法。
这样一来,既可以避免用户new一个对象,又可以实现方法的调用,看似很好。
其实,这种做法最大的缺点就是static作为一个静态方法,在加载类的时候就被加载到内存中,不管你用不用都占用这个位置,这种设计是不推荐的。
而采用单例模式的写法很好的解决了这个问题,如下:
public class DateUtil { public final String DATEFORMAT = "YYYY-MM-DD"; public static DateUtil instance = null; private DateUtil() { } private static Integer LOCK = 0; public static DateUtil getInstance() { synchronized (LOCK) { if (instance == null) { instance = new DateUtil(); } return instance; } } 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方法与单例模式的理解
- JAVA Static方法与单例模式的理解
- java 关于对“是否可以从一个static方法内部发出对非static方法的调用”问题的理解
- JAVA模板方法设计模式(从现实生活角度理解代码原理)
- java——多线程——单例模式的static方法和非static方法是否是线程安全的?
- 我理解的--java模板方法模式
- Java——单例模式的static方法和非static方法是否是线程安全的?
- java基础之equal()方法、static关键字、单例设计模式
- 关于Java中static方法的一点理解
- 对照java和spring理解python中单例模式的装饰器方法
- java中关于final方法与static方法不具备多态性的理解
- JAVA模板方法设计模式(从现实生活角度理解代码原理)
- java学习之路 之 高级类特性2-关键字static、类变量、类方法、单例模式
- 面向对象基础续2(static关键字、理解main方法、代码块、构造方法私有化(单例模式)) .
- 对代理模式与Java动态代理类的理解
- 认识理解Java中 native方法
- Java细节之static方法重写
- java 静态方法和静态变量 static
- JAVA 设计模式的另类理解