2016-12-01 4 views
0

Ich arbeite an einem Problem, wo verschiedene Tierarten die gleiche talk() -Methode von Animal-Schnittstelle implementieren.
Wenn Sie getAnimal() Methode betrachten, können Sie sehen, dass, wenn eine neue Art von Tier zum Programm hinzugefügt wird, innerhalb dieser Methode auch geändert werden muss.
Ich möchte neue Tiere nur hinzufügen, indem ich Tier unterklassiere, ohne etwas in den bereits vorhandenen Klassen zu ändern.
Fügen Sie beispielsweise ein Tier "Hund" hinzu, criteria = "loyal"; talk = "Woof".
Können Sie mir sagen, wie es möglich ist? Unten ist mein Code:Erstellen Sie eine dynamische Klasse in 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"); 
     } 
    } 
} 

Ich suchte auf Google, verstand es kann durch Reflexion getan werden. Aber ich weiß nicht wie. Wenn möglich, könntest du mir bitte dabei helfen? Danke im Voraus!

+0

Sie suchen wahrscheinlich eine 'anonyme innere Klasse' –

+2

Ich glaube nicht, dass Ihr Problem Reflexion erfordert, sondern nur Standard-OOP in Java. –

+1

'if (criteriae.equals (" Scary ")) { return new Wombat(); } ' –

Antwort

2

Nur um AnimalType, so dass Sie Runtime-Klasse Generation wissen äußerst komplex ist und nicht etwas für Anfänger empfohlen Sprache. Dies wäre ein ausgezeichnetes Szenario, um eine Karte mit anonymen Klassen zu verwenden.

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); 
    } 
} 

Wenn Sie wirklich Runtime-Klasse Generation bestehen darauf, auf wahr oder wenn Sie neugierig sind, wie es funktioniert, überprüfen ByteBuddy aus.

0

müssen Sie

class Dog implements Animal { 

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

der Hund Klasse definieren und die hinzufügen, wenn sonst

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

Das Problem ist hier. Ich möchte die Klasse Hund nicht auf diese Weise definieren. Ich möchte auf die Art und Weise tun, wie Benutzer Befehle wie "Hund hinzufügen" eingeben und dann Dog-Klasse erstellt wird. Art der dynamischen Klassenerstellung. –

0

Java unterstützt das Erstellen einer Klasse zur Laufzeit nicht. Aber es gibt wirklich bessere Möglichkeiten, um das zu erreichen, was Sie hier wollen. Ich werde zwei vorschlagen.

Erstens könnten Sie eine AnimalType Klasse erstellen, die das gesamte Verhalten einer Spezies enthält. Sie könnten dann eine Animal Klasse haben, die einen AnimalType als Konstruktorparameter verwendet.

Zweitens könnten Sie ein prototype Entwurfsmuster verwenden. In diesem Fall würde die Klasse Animal eine clone Methode benötigen, um ein neues Tier aus dem Prototyp zu erstellen. Die Factory-Klasse könnte dann eine Liste der Prototypen haben und jede gewünschte Logik verwenden, um den richtigen Prototyp zum Klonen auszuwählen.

Kommentar unten, wenn Sie weitere Details oder Beispielcode für eine dieser Optionen wünschen.

Verwandte Themen