java - 为什么在构造函数中声明并实例化临时对象而不是真实对象?

标签 java constructor objectinstantiation

如果这在某处有答案,请原谅我;我真的不知道要搜索什么...另外,我的术语可能不正确(声明、实例化等),因为我仍在学习 Java 和 OOP。

我正在阅读 Frank Carrano 所著的教科书:数据结构和抽象,第三版(第 20 章:字典实现),我遇到了一个看起来非常标准的类,其中包含一个私有(private)内部类。但我不太明白该方法论的一些内容。

我很难理解为什么要将一个对象(或对象数组)声明为外部类中的字段,然后在构造函数中实例化一个临时对象并将该字段初始化为临时对象,而不仅仅是在构造函数中实例化属性本身。

编辑:我将类型参数添加回代码中...在这种情况下,K 和 V 用于键和值,因为我们正在使用字典。我不知道这对这个问题是否重要......

我在这里重写了相关代码,重命名了类等,以便它们不那么本地化:

public class OuterClass<K, V> implements SomeInterface<K, V>
{
     private InnerClass<K, V>[] foo;                  // Declare array of inner class object
     private final static int CAPACITY = 10;    // Initial Array Capacity

     // Outer Class Constructor
     public OuterClass()
     {
          InnerClass<K, V>[] tempFoo = (InnerClass<K, V>[])new InnerClass[CAPACITY];
          foo = tempFoo;
     }

     // ...

     private class InnerClass<S, T>
     {
          // Inner Class Constructor
          private InnerClass()
          {
               // ...
          }

          // ...
     }
}

如上所述,我试图删除代码中的任何具体细节,因为我认为它们与问题无关。您是否有任何理由不只在外部类构造函数中执行此操作:

foo = (InnerClass[])new InnerClass[CAPACITY];

而不是:

InnerClass[] tempFoo = (InnerClass[])new InnerClass[CAPACITY];
foo = tempFoo;

最佳答案

这就足够了:

foo = new InnerClass[CAPACITY];

OP 泛型编辑后更新:

对于泛型类型参数,情况会发生变化,因为您在右侧使用了原始类型。在这种情况下,强制转换是必要的,并且您会收到编译器警告,因为强制转换不能是类型安全的。所以我们有:

foo = (InnerClass<K, V>[]) new InnerClass[CAPACITY];

关于java - 为什么在构造函数中声明并实例化临时对象而不是真实对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22946908/

相关文章:

c++ - (简单 C++ 概念)构造函数/析构函数调用的意外输出

c++ - 删除通过取消引用新对象初始化的对象

angularjs - 如何动态实例化服务?

java - 在Java中使用Calendar的add()方法添加超过30天

java - 在 Android Fragment 中使用 Firebase 电话身份验证

JAVA:经过这么多时间后中断线程

c++ - 构造函数体中的 auto_ptr 成员初始化(不在初始化器列表中)

c# - 如何删除 Excel 电子表格中的所有网格线,除了我在清除所有网格线后明确添加的网格线?

java - Ajax : Not able to redirect to a content page inside AEM SLING servlet