zoukankan      html  css  js  c++  java
  • JAVA Static方法与单例模式的理解

    近期用sonar測评代码质量的时候,发现一个问题,project中一些util类,曾经写的static方法都提示最好用单例的方式进行改正。

    为此,我细致想了想,发现还是非常有道理的。这里谈谈我个人对static方法与单例模式的理解。


    所谓单例模式,我不做过多解释,推荐java设计模式之禅这本书,好好理解一下。

    这里我谈谈两种写法:

    曾经一些公共的类,我不假思索,习惯依照例如以下写法去写:

    public class DateUtil {

        public final static String DATEFORMAT = "YYYY-MM-DD";

        private DateUtil() {

        }

        public static void changeDateFormat() {

        }
    }
    调用的时候直接DateUtil.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




  • 相关阅读:
    [转]ASP.NET中JSON的序列化和反序列化
    [转]JavaScriptSerializer中日期序列化
    [转]国外英语教学网页
    [转]linq to sql (Group By/Having/Count/Sum/Min/Max/Avg操作符)
    [转]Business Model Canvas(商业模式画布):创业公司做头脑风暴和可行性测试的一大利器
    [转]sql server transaction
    CentOS7安装配置PostgreSQL9.6
    使用struts的同步令牌避免form的重复提交
    Flink初探-为什么选择Flink
    jdbc三种常见用法
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4296687.html
Copyright © 2011-2022 走看看