0

次のクラス継承構造があるとします。

public class Animal
{
    public Animal()
    {
      setDefault();
    }

    public void setDefault()
    {
      Field[] Fields = this.getClass().getFields();
        for ( Field F : Fields )
        {
         // perform some initialization per field class
         if ( MyObject.class.isAssignableFrom( F.getType() ))
         {
             ( (MyObject) f.get(this)).setValue(0);
         }
         // ...
        }
    }
}

public class Cat extends Animal
{
   public Cat()
   {
      super();
      setDefault();
   }     
}

public class Kitten extends Cat
{
   public MyObject myobject1 = new MyObject();

   public Kitten()
   {
     super();
     setDefault();
   }
}

オブジェクトをインスタンス化すると、メンバーをインスタンス化せずに親クラスKittenのメソッドで実行されます。次に、初期化を試みるときに実行します。setDefault()Animalmyobject1NullPointerException

setDefault()各呼び出しで基本クラスの型を取得する方法はありますか? それは、Animalクラスにいるときですthis.getClass()(またはAnimalCatクラスでは yieldにCatなります。これは、親クラスから子クラスにのみデフォルト値を段階的に設定するためです。

他に適用できるセットアップはありますか?

もちろん、フィールドが null でないかどうかを確認するテストを追加できますが、それは重要ではありません。setDefault各クラス呼び出しのフィールドのみにデフォルトを設定したいと思います。

クラスの階層もメンバーの宣言の場所も変更できません。

4

2 に答える 2

0

各クラスで setDefault() メソッドをオーバーライドできます。

public class Animal
{
    public Animal()
    {
      setDefault();
    }

    public void setDefault()
    {
      Field[] Fields = this.getClass().getFields();
        for ( Field F : Fields )
        {
         // perform some initialization per field class
         if ( MyObject.class.isAssignableFrom( F.getType() ))
         {
             ( (MyObject) f.get(this)).setValue(0);
         }
         // ...
        }
    }
}

public class Cat extends Animal
{
   public Cat()
   {
      setDefault();
   }  

   @Override
   public void setDefault() {
       // do some special things
   }
}

public class Kitten extends Cat
{
   public MyObject myobject1 = new MyObject();

   public Kitten()
   {
       setDefault();
   }

   @Override
   public void setDefault() {
       // do some special things
   }
}
于 2013-08-27T12:26:37.090 に答える