2013-07-04 39 views
1

這是計算對象實例的有效方法嗎?還是我不應該重寫finalize?這是一個有效的方法來計數對象的實例嗎?

public class MyClass{ 
    private int instances; 
    public MyClass(){ 
     instances++; 
    }  
    @Override 
    public void finalize(){ 
     instances--; 
    } 
    public static int getInstances(){ 
     return instances; 
    } 
} 

該解決方案並不一定是線程安全的

+6

編號標記'實例'爲靜態易失性。其次,**從不**重寫'finalize'方法。 –

+1

我猜你沒有,你知道,實際上試試看,發現......不。 –

+1

否;這不是線程安全的。你想解決什麼問題? – SLaks

回答

4

馬克instances作爲static volatile。其次,永不覆蓋finalize方法。此外,在代碼AS-IS中,請注意,您不能訪問public static int getInstances方法中的instances變量。

+2

他在'finalize'中試圖做的是減少他自己的引用計數。雖然這不會真的起作用,但它使剩下的事情有點沒有意義。 –

+2

那麼實例得到遞減的地方呢? – Ayman

+2

@Ayman你肯定不會知道,因爲這是GC的工作,你無法控制這個。 –

-2

如果我得到你正在努力完成的任務,你想要保持已經在你的應用程序中創建的MyClass實例的數量。如果是這種情況,則需要聲明實例變量並將getInstances方法聲明爲static。

public class MyClass{ 
    private static int instances; 
    public MyClass(){ 
     instances++; 
    }  
    @Override 
    public void finalize(){ 
     instances--; 
    } 
    public static int getInstances(){ 
     return instances; 
    } 
} 

此外,我將實例重命名爲instancesCount(或簡單計數),併爲getInstances方法執行相同的重命名。

+2

構造函數中的實例計數增量不是線程安全的。在不同線程中同時創建兩個實例會導致計數錯誤。 – Keith

+3

*重寫finalize是要走的路* *不,它不是。關於何時執行完全沒有保證。它可能永遠不會在程序生命期間執行(而只能在退出時執行)。 –

+0

@Keith,線程安全不是必需的,但我同意你的評論。使用易失性計數器或通過鎖定進行同步。 – RudolphEst

相關問題