【问题标题】:Counter of interface objects in JavaJava中接口对象的计数器
【发布时间】:2014-10-27 10:12:18
【问题描述】:

在Java中,如果我想知道有多少MyClass类型的对象,我可以这样定义MyClass

public class MyClass {

    public static int count = 0;

    public MyClass() {
        count++;
    }

    //other stuff
    //...
}

然后,只是调用

MyClass.count

我可以得到创建的对象的数量。

我想知道是否有办法用接口做同样的事情,例如如果我有一个名为 ICountable 的接口,我怎么知道此时我的程序中有多少个 ICountable 对象。我正在考虑用工厂模式来做这件事,但是在任何设计方式中我都注意到了弱点,所以我还没有想出一个可行的解决方案,有人知道这样做的好方法吗?

【问题讨论】:

  • 你知道你必须先implement你的界面吗?所以我假设您将使用implements 您的 iCountable 接口的类的对象?
  • 除非你可以一些控制实现你的接口的人,否则除非你愿意把你的接口变成一个抽象类,否则这是不可能的。但是由于 Java 具有单一实现继承,这可能会干扰其他事情。
  • 当然可以,但是如何强制为所有实现我的接口的类实现计数系统?如何获得所有 ICountable 对象的数量而不单独计算所有实现类并求和?
  • @SebastianRedl 我试图用一个抽象类来做到这一点,但这不是我们所需要的,因为 java 不允许多重继承,所以它有点阻止我
  • @A4L 这应该是一个答案。

标签: java oop interface


【解决方案1】:

你可以看看这个帖子:

how many instances for a class exists at runtime in java

但我建议您不要实施这样的机制。在发布代码中几乎没有用例。对于调试/分析,有几种工具。如果我没记错的话,Eclipse 分析器会开箱即用地跟踪实例,只需启动它并观察。

【讨论】:

    【解决方案2】:

    请参考我在Get Member/Fields of an existing Object 中的回答,据我所知,如果不解析文件上的类路径以分析任何 .class 文件或(例如静态代码分析),就无法保证获取所有此类信息。

    即使有实现所需接口的类,这些类也可能无法被您的类加载器直接可见/访问(例如匿名类)。

    在我的分析器中仍然有一个库提到大多数时候都可以完成这项工作。

    【讨论】:

      【解决方案3】:

      单个interface 可以有多个实现。所有实现都应视为interface 的类型。

      您可以尝试类似的方法。

      我的界面

      public interface Val {}
      

      实现

      public class Impl1 implements Val {
       public Impl1(){
           Con.count++;
       }
      }
      

      .

      public class Impl2 implements Val {
          public Impl2(){
              Con.count++;
          }
      }
      

      您需要在这里使用全局计数器。

      例如:

      public final class Con {
       static int count;
      }
      

      现在你可以随时找到Val的计数

      public static void main(String[] args) {
           new Impl1();
           System.out.println(Con.count);
           new Impl2();
           System.out.println(Con.count);
       }
      

      您也可以在Impl1Impl2 中使用单独的变量来分别计算每个变量。

      【讨论】:

      • 是的,但我在说的是任何人都可以编写一个实现我的接口的类而不是实现计数系统,所以我会得到错误的数字
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多