写一个单例模式示例
*寫一個單例模式示例
*要點
*1.某個類只能有一個實例
- 構造器私有化
*2.它必須自行創建這個實例
- 含有一個該類的靜態變量來保存這個唯一的實例
*3.它必須自行向整個系統提供這個實例
- 對外提供獲取該實例的方式:1.直接暴露2.用靜態變量的get方法獲取
*幾種常見形式
*餓漢式:
在類初始化時直接創建對象,不管是否需要這個對象都會創建,
不存在線程安全問題
- 直接實例化餓漢式(簡潔直觀)public static final SingletonDemo INSTANSE=new SingletonDemo();private SingletonDemo() {}
- 枚舉式(最簡潔)枚舉類型:標識該實例的對象是有限幾個,我們可以定為一個,就成了單例public enum Singleton2{INSTANCE}
- 靜態代碼塊餓漢式(適合復雜實例化)public static final SingletonDemo INSTANCE;static {INSTANCE=new SingletonDemo();}private SingletonDemo() { }
*懶漢式:
延遲創建對象
- 線程不安全(適用與單線程)
- 線程安全(適用于多線程)
- 靜態內部類形式(適用于多線程)
懶漢式示例
/** 懶漢式:* 1)構造器私有化* 2)用一個靜態變量保存這個唯一的實例* 3)提供一個靜態方法,獲取這個實例對象*/class SingletonDemo {/** 線程不安全(適用與單線程)* private static SingletonDemo INSTANCE;private SingletonDemo(){ }public static SingletonDemo getINSTANCE() {if(INSTANCE==null) {INSTANCE=new SingletonDemo();}return INSTANCE;}*//*** // 線程安全(適用于多線程)private static SingletonDemo INSTANCE;private SingletonDemo(){ }public static SingletonDemo getINSTANCE() {if(INSTANCE==null) {synchronized (SingletonDemo.class) {if (INSTANCE == null) {INSTANCE = new SingletonDemo();}}}return INSTANCE;} *//** 靜態內部類形式(適用于多線程)* 在內部類被加載和初始化時,才創INSTANCE對象* 靜態內部類不會自動隨著外部類的加載和初始化而初始化,它是要單獨加載和初始化的* 因為是在內部類加載和初始化時創建的,因此線程是安全的*/private SingletonDemo() {}private static class Inner{private static final SingletonDemo INSTANCE=new SingletonDemo();}public static SingletonDemo getInstance() {return Inner.INSTANCE;} }public class SingletonTest{public static void main(String[] args) {SingletonDemo s1=SingletonDemo.getInstance();SingletonDemo s2=SingletonDemo.getInstance();System.out.println(s1==s2);System.out.println(s1);System.out.println(s2);} }static的作用:
1.修飾成員變量給變量加上static關鍵字后,變量變為全局變量*JVM在加載時會將此變量加載到方法區而不是堆里 2.修飾成員方法可以使用 類名.方法名 操作方法 不需要在new出對象 3.靜態代碼塊當new出一個對象后,static修飾的成員變量首先被初始化隨后是普通成員,最后是構造方法,*在程序運行的過程中,static只會在第一次new時被初始化 4.靜態導包 5.代碼塊靜態塊最先執行,其次時普通代碼塊,再是構造方法final的用法:
1.用在類上表示該類不可以被繼承 2.用在方法上表示該方法不可以被重寫(override) 3.用在變量上表示 該變量一旦被賦值 值不能被改變static修飾的屬性強調它們只有一個,final修飾的屬性表明
是一個常數(創建后不能被修改)。static final修飾的屬性
表示一旦給值,就不可修改,并且可以通過類名訪問。
總結
- 上一篇: 标准化窄带物联网商用网络 在福州试点落地
- 下一篇: Mac通过MAMP集成安装连接MySQL