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