Java 这是计算对象实例的有效方法吗?

Java 这是计算对象实例的有效方法吗?,java,object,Java,Object,这是计算对象实例的有效方法吗?还是我不应该放弃 public class MyClass{ private int instances; public MyClass(){ instances++; } @Override public void finalize(){ instances--; } public static int getInstances(){ return instances;

这是计算对象实例的有效方法吗?还是我不应该放弃

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

解决方案不必是线程安全的

实例标记为
静态易失性
。其次,never重写
finalize
方法。另外,在代码原样中,请注意,您不能在
public static int getInstances
方法中访问
instances
变量。

如果我得到了您试图完成的任务,您需要统计在应用程序中创建的MyClass实例数。如果是这种情况,则需要声明instances变量和getInstances方法static

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

此外,我会将实例重命名为InstanceCount(或简单地计数),并对getInstances方法执行相同的重命名

否。将
实例
标记为
静态易失性
。第二,永远不要覆盖
finalize
方法。我猜你没有,你知道,真正尝试过它并发现。。。否。@user2097804如果必须重写finalize方法,请记住还要调用
super.finalize()
,这样Java的标准finalize操作也会发生。不能保证
finalize
会运行。为什么它不必是线程安全的?您是否假设finalize必须在创建对象的线程中运行?他在
finalize
中尝试的是减少自己的引用计数。虽然这根本不起作用,但它使其余部分变得毫无意义。那么实例在哪里减少了呢?@Ayman你不能确定,因为这是GC的工作,你不能控制它。@Ayman如果你能实现
Closeable
接口并确保总是调用
close
方法,然后你可以减少那里的计数器。@BrianRoach为一个真实世界的案例做这么多的工作是非常有趣的,但是为了解决一个简单的好奇问题(在本例中看起来是这样),我认为这是不值得的。构造函数中的实例计数增量不是线程安全的。在不同线程中同时创建的两个实例将导致计数错误。覆盖finalize是一种方法。。。不,不是。对于何时执行,绝对没有任何保证。它可能永远不会在程序的生命周期内执行(相反,只能在退出时执行)。@Keith,线程安全不是一个要求,但我同意你的评论。使用易失性计数器或通过锁同步。我认为OP可能添加了“解决方案不必是线程安全的”。我本来没看到。@Keith很不幸,他错了,因为他试图通过
finalize()
;修改静态字段;这不会在同一个线程中调用,并且后增量/减量不是一个原子操作。这个答案是不正确的,可悲的是,OP接受了这个答案,却没有理解他试图做的事情中的无数问题。