2013-07-04 37 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

相关问题