天天看點

java static 單例模式_JAVA Static方法與單例模式的了解

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