Используя строку, чтобы найти класс в Java? - PullRequest
1 голос
/ 10 августа 2011

Я создал класс с именем Entity, и у меня есть следующий код:

Entity zombie1 = new Entity();

Я получаю входные данные «зомби» из сканера, а затем объединяю число на основе уровня в конце этогооставляя 'zombie1' в качестве строки ... Я хочу использовать эту строку и вызывать

zombie1.shoot("shotgun");

, но не могу найти решение.Я бы просто сделал оператор if, но я хочу иметь возможность создавать столько зомби, сколько захочу, и мне не нужно добавлять больше операторов if каждый раз.

Я читал статьи, используя отражение и forString.но, похоже, это не то, что я ищу.

Любая помощь будет хорошей.

Ответы [ 4 ]

3 голосов
/ 10 августа 2011

Возможные решения - использовать Map<String, Entity>, чтобы иметь возможность хранить и извлекать объекты на основе определенных строк. Если у вас есть ограниченное количество подтипов сущностей, таких как зомби, вампиры, жертвы и т. Д., Вы можете иметь Map<String, List<Entity>>, что позволит вам сопоставить строку с определенным типом сущности и затем получить этот тип по номеру.

например,

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Foo002 {
   private static final String ZOMBIE = "zombie";

   public static void main(String[] args) {
      Map<String, List<Entity>> entityMap = new HashMap<String, List<Entity>>();

      entityMap.put(ZOMBIE, new ArrayList<Entity>());

      entityMap.get(ZOMBIE).add(new Entity(ZOMBIE, "John"));
      entityMap.get(ZOMBIE).add(new Entity(ZOMBIE, "Fred"));
      entityMap.get(ZOMBIE).add(new Entity(ZOMBIE, "Bill"));

      for (Entity entity : entityMap.get(ZOMBIE)) {
         System.out.println(entity);
      }
   }
}

class Entity {
   private String type;
   private String name;

   public Entity(String type, String name) {
      this.type = type;
      this.name = name;
   }

   public String getType() {
      return type;
   }

   public String getName() {
      return name;
   }

   @Override
   public String toString() {
      return type + ": " + name;
   }

}
2 голосов
/ 10 августа 2011

Это не самая лучшая ставка. Лучше всего иметь карту;

// PLEASE LOOK INTO WHICH MAP WOULD BE BEST FOR YOUR CASE OVERALL
// HASHMAP IS JUST AN EXAMPLE.
Map<String, Entity> zombieHoard = new HashMap<String, Entity>;

String getZombieID( int id )
{
    return String.format( "zombie%s", id );
}
String createZombie() {
    String zid = getZombieID( Map.size() );
    Map.put( zid, new Entity() );
    return zid;
}

void sendForthTheHoard() {
   createZombie();
   createZombie();
   String currentZombie = createZombie();
   zombieHoard.get( currentZombie ).shoot( "blow-dryer" );
   zombieHoard.get( getZombieID( 1 ) ).eatBrains();
}
1 голос
/ 10 августа 2011

Поместите своих зомби в ArrayList. Пример:

ArrayList<Entity> zombies = new ArrayList<Entity>();
Entity zombie1 = new Entity();
zombies.add(zombie1);
Entity zombie2 = new Entity();
zombies.add(zombie2);
etc...

Тогда, когда пришло время вызвать определенного зомби к следующему:

zombies.get(1).shoot("shotgun");
0 голосов
/ 10 августа 2011

Если вы говорите о динамическом вызове метода для объекта, вы можете использовать Reflection, чтобы получить объект метода и вызвать его (Примечание: я мог непреднамеренно перепутать некоторый синтаксис C # в этой Java):

Entity zombie1 = new Entity();
Method shootMethod = Entity.class.getMethod("shoot", new Class[] { string.class });
shootMethod.invoke(zombie1, new Object[] { "shotgun" });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...