【问题标题】:How do I add an instance of type MyClass to an array of MyClass, declared in MyClass, inside the constructor of MyClass?如何在 MyClass 的构造函数中将 MyClass 类型的实例添加到 MyClass 中声明的 MyClass 数组?
【发布时间】:2018-09-26 04:23:47
【问题描述】:

为了跟踪实例,我们有一个数组 MyClass[] mc = new MyClass[5];

我想在构造函数调用本身期间保存在此数组中创建的 MyClass 的实例。

类似这样的:

public class MyClass{
  private static final int MAX_SIZE = 64;
  private static int number = 0;
  private static MyClass[] classList= new MyClass[MAX_SIZE];


  public MyClass(MyClass mc) { 
    classList[number++] = mc;
  }

  public static void main(String[] args) {
  MyClass mc1 = new MyClass(mc1);
}

但这不起作用,因为我得到了预期的“mc1 可能未初始化”错误,tbh。

现在,我知道我们可以创建另一种方法来将创建的类的实例保存在数组中,但是这种“保存类的实例”符合类的自身利益,并且不想强迫类的用户调用此方法。因此找到一种方法来在 const 本身中完成它。

我该怎么做呢?非常感谢您提前! :)

请朋友。

【问题讨论】:

  • 这不是一个好的设计。将类的 Array 与实际类本身分开。
  • 您将 mc1 作为参数传递给构造函数,该构造函数仅在创建 Object 时才被初始化。对于要创建的对象,它需要 mc1 在构造函数中至少为 null 的初始化值,所以这里有点死锁.所以你不能用这个
  • 感谢您的快速接受!

标签: java arrays class object instance


【解决方案1】:

您可以在构造函数中执行此操作:

classList[number++]  = this;

而且根本没有那个 mc 参数。

当然,整个想法都是不好的做法。一个类有不同的责任。您正在承担另一个责任(计算/列出实例)。所以除了你的代码容易造成内存泄漏之外,它还违反了单一职责原则。

如果您想跟踪某些对象,则有一个 另一个 类来保存此类列表并在那里显式注册新创建的对象。

【讨论】:

  • 谢谢!!这就是我需要的。我会牢记类设计实践并尝试实现它而不是这样做。
  • 一个类可以跟踪它的实例。参见例如整数。
  • 缓存不同于为每个实例保留硬引用的列表。除此之外,在处理好数字时,您通常需要值语义。
【解决方案2】:

在构造函数中使用MyClass mc 作为参数是错误的。无法初始化该 MyClass 实例,因为它一直需要另一个先前已初始化的实例。正如我之前的某人指出的那样,您可以使用... = this 并解决它,但不建议这样做。只需编写额外的方法。

【讨论】:

    【解决方案3】:

    使用列表(例如 ArrayList)可以做得更好。 ArrayList 的性能并不比数组差多少。

    公共类 ArrayTest { 私有静态列表 classList = new ArrayList();

    public ArrayTest() {
        classList.add(this);
    }
    
    public static void main(final String[] args) {
        final ArrayTest mc1 = new ArrayTest();
    }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-11
      • 2013-06-12
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多