JAVA Static方法與單例模式的理解


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





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM