最近用sonar测评代码质量的时候,发现一个问题,工程中一些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

转载于:https://www.cnblogs.com/hainange/p/6153623.html

JAVA Static方法与单例模式的理解相关推荐

  1. Java static方法里为什么不能使用this关键字

    Static方法是类方法,先于任何的实例(对象)存在.即Static方法在类加载时就已经存在了(JAVA虚拟机初始化时), 但是对象是在创建时才在内存中生成.而this指代的是当前的对象. 参考:ht ...

  2. java static方法

    static方法 1.static方法的作用访问static变量和static方法2.static方法的调用方式通过类名调用.通过对象名来访问3.不可以静态方法中不可以访问非静态变量 静态方法中不可以 ...

  3. java static方法过多_Java 项目静态方法过多会有什么样影响?静态类、静态方法影不影响多线程性能...

    最近在看 Play! framework,整个控制层都是静态方法,引发了很多争论和口水,大家怎么看的? 静态方法不能继承,会影响①部分设计思路,设计出的程序比较结构化. 另外静态方法不能读取对象级别的 ...

  4. Java static方法中为什么只能调用静态方法?

    import java.io.*; import java.util.*;public class Main{public static void main(String args[]) throws ...

  5. java static方法(单例)

    参考 1.可以直接用过类名调用,大局观(类(静态变量或者方法,方法)),静态变量是独立于类里面的,普通方法要通过对象去调用 2.static在类中只存在一份副本:static变量也称作静态变量,静态变 ...

  6. main方法中args_public static void main(String [] args)– Java main方法

    main方法中args public static void main(String[] args) is the most important Java method. When you start ...

  7. java使用单例与使用static方法的对于和个人理解

    1最近在重构项目中的老模块,打算引入spring boot对原有项目自己封装的依赖注入模块进行替换.项目中存在大量的工具类,大都是使用static方法编写的,比如时间工具类用于格式化日期,编码工具类用 ...

  8. java中的static方法可以被重写吗?(从方法调用过程理解)

    答案是:不可以. 首先明确一点,在子类中重写父类的static方法,是不会报错的,编译也可以通过,但是在通过一个声明为父类,实际类型为子类的引用变量调用该方法时,发现被调用的仍是父类中原本以为会被覆盖 ...

  9. java static关键字_好程序员Java教程分享static关键字的理解

    好程序员Java教程分享static关键字的理解,static关键字含义可以理解为静态的. 1. 当其修饰属性时,该属性为整个类公有,所有的对象操作的都是同一个静态属性.所以调用时应该使用类名去调用, ...

最新文章

  1. K8s, Kafka事件溯源架构模式和用例示例
  2. 便携式不锈钢管道焊接机器人_304不锈钢管居然可以发黑!?
  3. web login do.php,dologin.php
  4. 【错误记录】国际化报错 ( “xxx“ is not translated in “zh“ (Chinese) )
  5. Geany 代码自动补齐功能设置
  6. 通过SAP customizing修改显示message 的type
  7. 计算机网络 实验教案,《计算机网络》实验教案.pdf
  8. input 框 去掉下面的提示文字、提示选项
  9. python类的使用_python类的使用
  10. js小学生图区_js实现图片区域可点击大小随意改变(适用移动端)代码实例
  11. mysql 并发_mysql 的读写锁与并发控制
  12. ubuntu解决安装Scrapy库时报x86_64-linux-gnu-gcc错误
  13. Robot Framework操作
  14. Web前端JSP面试题
  15. golang mysql null_Golang将变量声明为NULL
  16. 支持流量计费的云服务器,云服务器流量计费功能
  17. 科学网肖波:海外博后申请的一点经验与看法
  18. Linux下IPC方式之共享存储映射(mmap)
  19. PS学习笔记--操作篇
  20. ImageJ如何测量物体的面积大小

热门文章

  1. Linux 双网卡绑定测试
  2. jQuery带缩略图的宽屏焦点图插件
  3. expect脚本同步文件、 expect脚本指定host和要同步的文件 、 构建文件分发系统 、批量远程执行命令...
  4. L1-008.求整数段和
  5. 如何实现两个路由下的电脑互相访问
  6. Nodejs服务器端脚本
  7. poj 3662 Telephone Lines spfa算法灵活运用
  8. Python基础14-迭代器与生成器
  9. css 选择器 伪元素_CSS伪元素-解释选择器之前和之后
  10. 超越Android:Kotlin在后端的工作方式