为什么在构造函数中声明和实例化temp对象而不是真实对象?

时间:2014-04-08 19:55:13

标签: java constructor objectinstantiation

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

我正在阅读教科书:数据结构与抽象,Frank Carrano的第3版(第20章:字典实现),我遇到了一个非常标准的类,其中包含私有内部类。但是有一些关于我不太了解的方法。

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

编辑:我将类型参数添加回代码... 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;

3 个答案:

答案 0 :(得分:5)

这就够了:

foo = new InnerClass[CAPACITY];
OP的泛型编辑后

更新:

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

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

答案 1 :(得分:3)

您发布的代码中没有任何目的。但是,如果对象的实例化可能抛出异常并且您想要处理它,则通常可以使用此常规方法的用例。考虑这样的事情:

private final Image image;

public MyClass() {
    image = ImageIO.read(new File("myImage.png"));
}

这导致编译器错误,因为我还没有处理可能的IOException。所以我必须做类似下面的事情,这意味着我需要中间变量:

public MyClass {
    Image image = null;
    try {
        image = ImageIO.read(new File("myImage.png"));
    }
    catch(IOException ioe) {
        //Perform logging, whatever
    }
    this.image = image;
}

...所以,仅仅因为它对你粘贴的代码毫无意义,不要认为这种技术从来没有用过。当然,这只是final变量的情况。

答案 2 :(得分:-1)

是的,正如梅诺所说。这没有任何意义。