处理嵌套类

时间:2015-09-08 14:58:42

标签: java

我很难优雅地处理以下类:

假设我有以下A类:

class A{

  B b1;

  class B{

    C c1;
    D d1;

    class C{
    .
    .
    .
    }

    class D{
    .
    .
    .
    }

  }
}

我也有AA级:

class AA{

  B b1;

  class B{

    C c1;
    E e1;

    class C{
    .
    .
    .
    }

    class E{
    .
    .
    .
    }

  }
}

我需要创建和初始化A或AA的对象,具体取决于某些标志状态。 请注意,类A中的类B嵌套类D,而类AA中的类B嵌套类E!

我的自动思想是从一些基类派生它们并使用工厂。 然后我会得到一个我可以使用的对象,但是我将面临使用D或E对象的需要。 但我不确切知道如何实现这个想法。有可能吗?有没有更好的方法来实现它?

谢谢!

2 个答案:

答案 0 :(得分:1)

一般来说,我会尝试避免多级内部类,因为它经常会创建非常复杂的代码。

在您的示例中,由于AAA的字段类型为B,因此无需使用内部类:

class Bar {
   Foo foo;

   static class Foo { // this is just a nested class now, it can easily be moved to top level
       private Bar parent;
   }

   void setFoo(Foo foo) {
      this.foo = foo;
      foo.parent = this;
   }
}

(上面只是一个简化的示例来显示机制,在实际代码中你应该进行额外的检查,即foo != null以及如果foo.parent已经设置为非 - 空值)

如果AB都是不可变的,情况会略有不同,在这种情况下B的实例化必须由A严格控制。

答案 1 :(得分:1)

如果您需要以这种方式嵌套类,请先修改您的设计。如果你真的想坚持下去,你可以创建一个属性对象,并以编程方式(工厂?)实例化正确的对象。

class B{

   C c1;
   // ...

   // possible a D & E parent class
   Object X;
}

class A
  B b1;
  // ...
}

根据您的需要,您可以通过实例化方式将泛型和/或构造函数组合在一起,可以导致条件实例化(正确的B)。在这种情况下,在工厂中提供所有这些逻辑是有意义的恕我直言