在Java中避免RTTI

des*_*old 0 java oop rtti

如果我有一个超类,比如说Animal,

和两个子类:ZebraGiraffe,

如果我决定定义一个动物矢量:

Vector <Animal> animals = new Vector();
Run Code Online (Sandbox Code Playgroud)

我想说:你可以添加长颈鹿,但你必须先拥有至少一个斑马.

不使用RTTI的最佳方法是什么?(instanceof)

Ita*_*man 5

定义自己的类:

class Animals extends Vector<Animal>
{
   public Animals(Zebra z) { add(z); }
}
Run Code Online (Sandbox Code Playgroud)

另外两点:

  • 建议更喜欢使用ArrayList而不是Vector.
  • 您可能希望覆盖remove()方法以确保Zebra始终保留在集合中.

就个人而言,我会选择一种根本不使用继承的设计.因此,我的类将委托给它们而不是子类化vector(或ArrayList):

class Animals extends 
{
   private final Vector<Animal> inner = new Vector<Animal>();

   public Animals(Zebra z) { add(z); }

   // Delegate to whatever methods of Vector that Animals need to support, e.g.,
   void add(Animal a) { inner.add(a); }

   ...
}
Run Code Online (Sandbox Code Playgroud)