0

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

我正在阅读教科书:数据结构和抽象,弗兰克卡拉诺的第三版(第 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;
4

3 回答 3

5

这就够了:

foo = new InnerClass[CAPACITY];

OP 的泛型编辑后更新:

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

foo = (InnerClass<K, V>[]) new InnerClass[CAPACITY];
于 2014-04-08T19:58:58.830 回答
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变量。

于 2014-04-08T20:03:53.713 回答
-1

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

于 2014-04-08T20:04:01.533 回答