簡體   English   中英

單例類每次都返回新的實例

[英]Singleton Class return new Instance every time

我正在嘗試創建一個單例類,但它每次都會返回一個新實例。 這是我的代碼。

我做錯了什么嗎? 為什么它每次都返回一個新實例?

應該和我想的一樣。

public final class SingletonA {     
    private static SingletonA instance;

    private SingletonA(){
    }

    public static SingletonA getInstance() {    
        if(instance==null)
        {
            System.out.println("RETURNING NEW INSTANCE OF SingletonA Class");
            return new SingletonA();
        }
        System.out.println("RETURNING OLD INSTANCE OF SingletonA Class");
        return instance;
    }
}

public class SingletonB {
    public static void main(String[] args) {
        SingletonA one = SingletonA.getInstance();
        System.out.println("1."+one+" | "+one.hashCode());

        SingletonA two = SingletonA.getInstance();
        System.out.println("2."+two+" | "+two.hashCode());

        SingletonA three = SingletonA.getInstance();
        System.out.println("3."+three+" | "+three.hashCode());
    }
}

// HERE IS THE OUTPUT
RETURNING NEW INSTANCE OF SingletonA Class
1.oop.singleton.SingletonA@2a139a55 | 705927765
RETURNING NEW INSTANCE OF SingletonA Class
2.oop.singleton.SingletonA@15db9742 | 366712642
RETURNING NEW INSTANCE OF SingletonA Class
3.oop.singleton.SingletonA@6d06d69c | 1829164700

如下更改

if(instance==null) {
    System.out.println("RETURNING NEW INSTANCE OF SingletonA Class");
    instance = new SingletonA();
}

您必須分配instance否則檢查將始終產生true,從而返回一個新實例:

public static SingletonA getInstance() {    
    if(instance==null)
    {
        System.out.println("CREATING NEW INSTANCE OF SingletonA Class");
        instance = new SingletonA();
    }
    System.out.println("RETURNING INSTANCE OF SingletonA Class");
    return instance;
}

這是不正確的,因為您要返回SingletonA的新實例,並且永遠不要將其分配給對象實例。

 public static SingletonA getInstance() {    
        if(instance==null)
        {
            System.out.println("RETURNING NEW INSTANCE OF SingletonA Class");
            return new SingletonA();
        }
        System.out.println("RETURNING OLD INSTANCE OF SingletonA Class");
        return instance;
    }

你的意思是肯定的

 public static SingletonA getInstance() {    
        if(instance==null)
        {
            System.out.println("RETURNING NEW INSTANCE OF SingletonA Class");
            instance = new SingletonA();
        }
        System.out.println("RETURNING OLD INSTANCE OF SingletonA Class");
        return instance;
    }

您應該在返回空檢查的測試之前,將實例初始化為新的SingletonA()。

public final class SingletonA {     
    private static SingletonA instance;

    private SingletonA(){
    }

    public static SingletonA getInstance() {    
        if(instance==null)
        {
            System.out.println("RETURNING NEW INSTANCE OF SingletonA Class");
            // You are missing this assignment. 
            instance = new SingletonA();
            return instance; 
        }
        System.out.println("RETURNING OLD INSTANCE OF SingletonA Class");
        return instance;
    }
}
public static SingletonA getInstance() {    
    if(instance==null)
    {
       instance = new SingletonA();
    }
    return instance;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM