近期用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

JAVA Static方法与单例模式的理解的更多相关文章

  1. java static 方法使用笔记

    有入参的static方法,可以正常使用 static的作用是申明:这是类的静态方法,什么时候都可以调用,可以传入入参,也可以不传. 上代码: 1.带静态方法的类: public class MakeP ...

  2. java static方法不能被重写@Override

    重写方法的目的是为了多态,或者说:重写是实现多态的前提,即重写是发生在继承中且是针对非static方法的. 语法上子类允许出现和父类只有方法体不一样其他都一模一样的static方法,但是在父类引用指向 ...

  3. java——多线程——单例模式的static方法和非static方法是否是线程安全的?

    单例模式的static方法和非static方法是否是线程安全的? 答案是:单例模式的static方法和非static方法是否是线程安全的,与单例模式无关.也就说,如果static方法或者非static ...

  4. JAVA设计模式 1 设计模式介绍、单例模式的理解与使用

    数据结构我们已经学了一部分了.是该了解了解设计模式了.习惯了CRUD的你,也该了解了解这一门神器.我为啥要说是神器呢? 因为在大厂的面试环节.以及很多的比如 Springboot Mybatis 等开 ...

  5. JAVA中的static方法

    static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何 ...

  6. 深入理解Java中方法的参数传递机制

    形参和实参 我们知道,在Java中定义方法时,是可以定义参数的,比如: public static void main(String[] args){ } 这里的args就是一个字符串数组类型的参数. ...

  7. Java 反射理解(三)-- Java获取方法信息

    Java 反射理解(三)-- Java获取方法信息 基本的数据类型.void关键字,都存在类类型. 举例如下: public class ClassDemo2 { public static void ...

  8. Java中synchronized 修饰在static方法和非static方法的区别

    [问题描述]关于Java中synchronized 用在实例方法和对象方法上面的区别 [问题分析]大家都知道,在Java中,synchronized 是用来表示同步的,我们可以synchronized ...

  9. java static 变量,和方法从属于类

    第36集 java static 变量,和方法从属于类 可以用类来直接调用static属性和方法 static方法不能调用非静态的属性和方法,反之可以 new产生的对象,不包括static 属性和方法

随机推荐

  1. LeetCode Solutions : Reorder List

    →-→Ln-1→Ln, reorder it to: L→Ln-2→- You must do this in-place without altering the nodes' values. Fo ...

  2. iOS kvc

    kvc在我的脑海里用来更改属性的实例变量值. 今天,他们遇到了kvc第二次去学习它,在网上看了很多博客,这似乎不符合我的口味,为了提取一些以下的.总结自己的. http://www.cnblogs.c ...

  3. WPF学习(1)WPF概述

    WPF(Windows Presentation Foundation)是微软推出的基于Windows Vista的用户界面框架,属于NET Framework 3.0的一部分.它提供了统一的编程模型 ...

  4. SQL Server中TempDB管理(version store的逻辑结构)

    原文:SQL Server中TempDB管理(version store的逻辑结构) 原文来自: http://blogs.msdn.com/b/sqlserverstorageengine/arch ...

  5. 这个夏天不AC(杭州电2037)

    这个夏天不AC Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  6. yii组态 redis主从配置(随着代码)

    最近的欲望redis 主从,但yii内建的redis 它不支持主从.不仅写了一个好办法 结构例,以下: 1.main.php通过添加下面的句子: //redis缓存配置 'cache_redis' = ...

  7. FZU2126:消除类游戏(DP)

    Problem Description S近期在玩一种游戏. 这样的游戏的规则是一个一个地往一个栈里放有颜色的球,当栈顶连续k个球颜色同样时.这k个球立马同一时候消失. 如今S已经往栈里放了n个球,他 ...

  8. Bob大叔观OO原则

    Bob大叔观OO原则 上篇总结了经典的23种 设计模式,详细的解读后期会陆续的详细揭开.使用设计模式的根本原因就是为了增强代码的复用性和可维护性.而面向对象是实现代码复用的有效途径,所以这里有必要了解 ...

  9. 于Unity3D调用安卓AlertDialog

    例如,下面的示例代码演示 package com.sample.sampletest; import android.app.AlertDialog; import android.content.D ...

  10. WIN8 、WIN7 下IIS7.5、IIS8 的rewrite 伪静态功能设置方法

    原文 WIN8 .WIN7 下IIS7.5.IIS8 的rewrite 伪静态功能设置方法 win7和win8系统都自带有iis的功能.关于IIS的安装,上一篇已经讲述,这里就不重复了. 下面说下在w ...