2016-12-01 10 views
0

私は、異なる動物型がAnimalインタフェースと同じtalk()メソッドを実装するという問題に取り組んでいます。
getAnimal()メソッドを見ると、新しい種類の動物がプログラムに追加されたときに、そのメソッドの内部も変更する必要があることがわかります。
既存のクラスで何も変更せずにAnimalをサブクラス化するだけで、新しい動物を追加したいと考えています。
たとえば、動物「Dog」を追加すると、criteria = "loyal"となります。 talk = "woof"
どうすれば可能か教えてください。以下は私のコードですJavaで動的クラスを作成する

interface Animal { 

    public void talk(); 
} 

class Lion implements Animal { 

    @Override 
    public void talk() { 
     System.out.println("ROARRRRR"); 
    } 
} 

class Mouse implements Animal { 

    @Override 
    public void talk() { 
     System.out.println("SQUEEEEEAK"); 
    } 
} 

class Bison implements Animal { 

    @Override 
    public void talk() { 
     System.out.println("BELLOWWWWW"); 
    } 
} 

class AnimalType { 

    public static Animal getAnimal(String criteria) { 

     // I refactor this method 
     if (criteria.equals("small")) { 
      return new Mouse(); 
     } else if (criteria.equals("big")) { 
      return new Bison(); 
     } else if (criteria.equals("lazy")) { 
      return new Lion(); 
     } 
     return null; 
    } 
} 

public class AnimalExamples { 

    public static void main(String[] args) { 
     AnimalType.getAnimal("small").talk(); 
     AnimalType.getAnimal("big").talk(); 
     AnimalType.getAnimal("lazy").talk(); 

     // how to add an animal "Dog" here, criteria="loyal"; talk="woof" 
     AnimalType.getAnimal("loyal").talk(); 

     try { 
      AnimalType.getAnimal("small").talk(); 
     } catch (Exception ex) { 
      System.out.println("Animal does not exists"); 
     } 
    } 
} 

私はGoogleで検索しましたが、それは反映されていることがわかりました。しかし、どのように知りません。可能であれば、これで私を助けてくれますか?前もって感謝します!

+0

あなたはおそらく「匿名の内部クラス」を探しています –

+2

あなたの問題は、リフレクションを必要とするとは思われませんが、Javaでは標準のOOPであると思います。 –

+1

'if(criteria.equals(" Scary ")){ 新しいWombat()を返します。 } ' –

答えて

2

をAnimalTypeに追加する必要があります言語。これは、マップを匿名クラスに使用する優れたシナリオです。

class AnimalType { 
    private static final Map<String, Animal> animals = new HashMap<String, Animal>(); 

    static { 
     // Populating map with default animals 
     addAnimal("big","BELLOWWWWW"); // bison 
     addAnimal("small","SQUEEEEEAK"); // mouse 
     addAnimal("lazy","ROARRRRR"); // lion 
     addAnimal("loyal","WOOF "); // dog 
    } 

    public static void addAnimal(String criteria, final String sound) { 
     // Assigning a anonymous implementation of animal to the given criteria 
     animals.put(criteria, new Animal() { 
      @Override 
      public void talk() { 
       System.out.println(sound); 
      } 
     }); 
    } 

    public static Animal getAnimal(String criteria) { 
     // Returning an animal from the animals map 
     return animals.get(criteria); 
    } 
} 

あなたが本当に真のランタイムクラスの生成を主張したり、それがどのように動作するか、あなたが興味があれば、ByteBuddyをチェックアウトしないと。

0

あなたは犬のクラスに

class Dog implements Animal { 

    @Override 
    public void talk() { 
     System.out.println("woof"); 
    } 
} 

を定義し、それ以外の場合は、ランタイム・クラスの生成は非常に複雑で何か初心者にはお勧めできませんことを知っているだけので

} else if ("loyal".equals(criteria)) { 
     return new Dog(); 
} 
+0

問題はここにあります。私はこのようにクラスDogを定義したくありません。私は、ユーザーが "Add Dog"のようなコマンドを入力してDogクラスが作成されるようなやり方でやりたい。ダイナミックなクラス作成の種類。 –

0

Javaは実行時にクラスの作成をサポートしていません。しかし、あなたがここで望むものを達成するための本当に良い方法があります。私は2つを提案します。

最初に、種に関するすべての共有動作を含むAnimalTypeクラスを作成できます。その後、コンストラクタパラメータとしてAnimalTypeを取るAnimalクラスを持つことができます。

第2に、prototypeデザインパターンを使用できます。この場合、Animalクラスはプロトタイプから新しい動物を作成するためにcloneメソッドを必要とします。ファクトリクラスはプロトタイプのリストを持つことができ、複製する正しいプロトタイプを選択するロジックを使用します。

これらのオプションの詳細またはサンプルコードが必要な場合は、以下のコメントを参考にしてください。

関連する問題