Hans van der Laan
Hans van der Laan

Reputation: 545

Java create instances of classes on the fly

I am making a small card game. In this game a new player is an instance of a class, AIPlayer or HumanPlayer which extends a general player class.

Currently to generate players I have the following code:

private List<Player> players;

HumanPlayer playerA = new HumanPlayer("playerA");
playerA.addObserver(gameModelObserver);
players.add(playerA);

AIPlayer playerB = new AIPlayer("playerB");
playerB.addObserver(gameModelObserver);
players.add(playerB);

AIPlayer playerC = new AIPlayer("playerC");
playerC.addObserver(gameModelObserver);
players.add(playerC);

HumanPlayer playerD = new HumanPlayer("playerD");
playerD.addObserver(gameModelObserver);
players.add(playerD);

Is it possible to dynamically generate these classes? Could I do something like iterating over all the elements of a linkedlist with a player name and a boolean to indicate if their are AI or Human and generate an instance of a class for them then. If so, how?

Edit: to make it clearer, I'm looking if something like this is possible:

for(int i=0; i<x; i++){
player i = new Player("i");
i.addObserver(gameModelObserver);
players.add(i); }

Upvotes: 1

Views: 1545

Answers (2)

Sertage
Sertage

Reputation: 3263

This not answer your question, but, maybe solve your problem:

private List<Player> players;

public void createPlayerByName(String name, Class type) {
  Player player = type.equals(HumanPlayer) ? new HumanPlayer(name) : new IAPlayer(name);
  player.addObserver(gameModelObserver);
  players.add(player);
}

public void createHumanPlayerByName(String name) {
  createPlayerByName(name, HumanPlayer.class);
}

public void createIAPlayerByName(String name) {
  createPlayerByName(name, AIPlayer.class);
}

So with your list you just need to do this:

for (String name : humanNameList) {
  createHumanPlayerByName(name);
}

for (String name : aiNameList) {
  createAIPlayerByName(name);
}

Upvotes: 5

Andrea Iacono
Andrea Iacono

Reputation: 802

Probably something like this:

class Player {

    String name;
    Type type;

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

Player[] playersList = { new Player("playerA", Type.HUMAN), new Player("playerB", Type.AI)};
for (Player player: playersList) {
    if (player.type == Type.AI) {
            AIPlayer aiPlayer = AIPlayer.class.getConstructor(String.class).newInstance(player.name);
            aiPlayer.addObserver(gameModelObserver);
            players.add(aiPlayer);                                    }
    else {
            HumanPlayer humanPlayer = HumanPlayer.class.getConstructor(String.class).newInstance(player.name);
            humanPlayer.addObserver(gameModelObserver);
            players.add(humanPlayer);
    }

}

Upvotes: 1

Related Questions