簡體   English   中英

Java單例方法允許對象的多個實例

[英]Java singleton approach is allowing more than one instance of the object

我最初編寫了以下代碼。 目的是確保在任何時間僅創建類的一個對象。

public class singleinstance {
private static int instance;

public singleinstance(){
    if(instance != 0){
        throw new IllegalStateException("More than one instance");
    }
    System.out.println(instance);
    instance ++;
    System.out.println(instance);
}
}

稍后,當我檢查互聯網以了解這是否是執行此操作的最佳方法時,我遇到了術語singleton ,並使用私有構造函數,並且遇到了此鏈接,我在其可接受的答案部分中嘗試了相同的代碼,但是定義了一個計數器變量並將其打印出來,並且可以看到該類的實例數不止一個。 我正在粘貼下面的代碼。

public class Singleton {
private static int counter=0;
private static Singleton instance;

/**
 * A private Constructor prevents any other class from
 * instantiating.
 */
private Singleton() {
    // nothing to do this time
}

/**
 * The Static initializer constructs the instance at class
 * loading time; this is to simulate a more involved
 * construction process (it it were really simple, you'd just
 * use an initializer)
 */
static {
    instance = new Singleton();
}

/** Static 'instance' method */
public static Singleton getInstance() {
    return instance;
}

// other methods protected by singleton-ness would be here...
/** A simple demo method */
public int demoMethod() {
    counter++;
    return counter;
}
}

Singletontest.java

public class Singletontest {
public static void main(String[] args) {
    Singleton tmp = Singleton.getInstance();
    System.out.println(tmp.demoMethod());
    Singleton tmp1 = Singleton.getInstance();
    System.out.println(tmp1.demoMethod());
}
}

測試類,當被執行時,印刷12 ,這意味着類的兩個實例與單例類創建。 如果有可能,為什么將其視為單例? 請清除我的理解。

編輯::對該方法的調用再次增加了該值。 但是再次,我可以交替調用方法tmp1.demoMethod(), tmp.demoMethod()多次,這使我認為tmp和tmp1是創建的兩個對象。 如何確認或可以研究哪些內容,以確認這只是一個實例?

在您的示例中,tmp和tmp1是同一對象實例。 您可以通過打印兩個對象來檢查它:

System.out.println(tmp);
System.out.println(tmp1);

之后,您在同一對象上調用該方法兩次,並且計數器增加兩次。 但是只創建了一個Singleton對象

您的結論是不正確的,增加數量將恰好相反(您只有一個實例)。 但是您的計數器是靜態的,這意味着它被所有實例共享,因此它不能用作參數

  1. 使計數器變為非靜態。 這意味着Singleton類的每個實例將有其自己的計數器,從0開始
  2. 然后調用您的代碼。 如果得到1、2,則只有Singleton類的一個實例。 如果得到1、1,則意味着您有兩個Singleton類的實例。 但這不會發生

順便說一下,tmp和tmp1是對同一實例的兩個引用

這里的tmp和tmp1是同一個對象實例,如果您嘗試打印tmp和tmp1,它將是相同的。 我的意思是它指向同一對象。

它沒有創建多個實例。 您的靜態變量只會增加。

將靜態變量視為類變量,而不是實例變量。

在這里,您僅從Singleton對象調用方法。 第一次調用Singleton.getInstance() ,將獲得counter變量值設置為0的對象。

之后,您通過單例對象調用demoMethod ,它將counter值增加到1。然后再次通過Singleton.getInstance()檢索對象時,它將為您提供變量值為1的相同對象實例,這就是為什么在以下情況下打印2的原因您通過它調用demoMethod

現有 :您已將counter變量聲明為靜態/類變量(在同一類的多個實例之間共享)。

private static int counter=0;

在方法demoMethod您將使用++運算符來遞增計數器,以便每次在實例上調用該方法時,計數器值都會增加-這就是將其打印為1,2的原因

您可以這樣嘗試:

counter變量聲明為類內的實例變量

private int instance;

現在輸出為1,1

我更喜歡這種方式來創建Singleton類。

public class Singleton {

private static Singleton instance;

private Singleton() {  
}

public static Singleton getInstance() {
    if(instance == null){
       instance = new Singleton();  
    }
    return instance;
}

}

暫無
暫無

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

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