近期用sonar測評代碼質量的時候,發現一個問題,project中一些util類,曾經寫的static方法都提示最好用單例的方式進行改正。
為此,我細致想了想,發現還是非常有道理的。這里談談我個人對static方法與單例模式的理解。
所謂單例模式,我不做過多解釋,推薦java設計模式之禪這本書,好好理解一下。
這里我談談兩種寫法:
曾經一些公共的類,我不假思索,習慣依照例如以下寫法去寫:
public class DateUtil { public final static String DATEFORMAT = "YYYY-MM-DD"; private DateUtil() { } public static void 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