2016-12-01 3 views
0

다른 동물 유형이 동물 인터페이스와 동일한 talk() 메소드를 구현하는 문제에 대해 작업하고 있습니다.
getAnimal() 방법을 보면, 새로운 종류의 동물이 프로그램에 추가되면 그 방법의 내부도 변경되어야한다는 것을 알 수 있습니다.
나는 이미 존재하는 클래스에서 아무것도 바꾸지 않고 Animal을 서브 클래스 화함으로써 새로운 동물을 추가하고 싶다.
예를 들어 "Dog"라는 동물을 추가하면 criteria = "loyal"이됩니다. talk = "woof".
가능한지 말해 줄 수 있습니까?자바에서 동적 클래스 만들기

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

내가, 구글에 검색이 반사하여 수행 할 수 있습니다 이해 : 다음은 내 코드입니다. 그러나 어떻게해야할지 모르겠다. 가능하다면, 이걸로 나를 도울 수 있겠 니? 미리 감사드립니다!

+0

아마도 '익명의 내부 클래스'를 찾고있을 것입니다. –

+2

여러분의 문제는 반영이 필요하지 않지만 Java에서는 표준 OOP로만 생각됩니다. –

+1

'if (criteria.equals ("Scary")) { return new 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는 런타임에 클래스 생성을 지원하지 않습니다. 그러나 여기서 원하는 것을 성취 할 수있는 더 좋은 방법이 있습니다. 나는 두 가지를 제안 할 것이다.

먼저 종에 대한 모든 공유 동작을 포함하는 AnimalType 클래스를 만들 수 있습니다. 그러면 생성자 매개 변수로 AnimalType을 사용하는 Animal 클래스를 가질 수 있습니다.

두 번째로 prototype 디자인 패턴을 사용할 수 있습니다. 이 경우 Animal 클래스는 프로토 타입에서 새 동물을 만들려면 clone 메서드가 필요합니다. 그런 다음 팩토리 클래스는 프로토 타입 목록을 가지고 올바른 프로토 타입을 선택하기 위해 원하는 논리를 사용합니다.

이 옵션 중 하나에 대한 자세한 내용이나 샘플 코드가 필요한 경우 아래에 설명을 추가하십시오.