2016-06-02 3 views
-3

Пожалуйста, извините меня, если этот вопрос выглядит немым для обычного Java-программиста, но я застрял в этой проблеме. Я хочу назвать метод getPoliticCards() из класса PoliticCard в классе DrawCard(Player player). Сначала я использовал static arraylist в PoliticCard, поэтому у меня не было проблем, но мне пришлось изменить его, потому что я должен был одновременно запускать несколько сеансов игры.Java-вызов метода без создания экземпляра

public enum Color { 
    BLACK, PURPLE 
} 
public class Player { 
    private int id; 
    private ArrayList<Color> politicCards; 
    public Player(int id){ 
     this.setId(id); 
     ArrayList<Color> array=new ArrayList<Color>(); 
     setPoliticCards(array); 
    } 
    public int getId() { 
     return id; 
    } 
    public void setId(int id) { 
     this.id = id; 
    } 

    public ArrayList<Color> getPoliticCards() { 
     return politicCards; 
    } 
    public void setPoliticCards(ArrayList<Color> politicCards) { 
     this.politicCards = politicCards; 
    } 
} 
public class PoliticCard { 
    private ArrayList<Color> politicCards; 
    public PoliticCard(){ 
     setPoliticCards(new ArrayList<Color>()); 
     politicCards.add(Color.BLACK); 
     politicCards.add(Color.PURPLE); 
    } 
    public ArrayList<Color> getPoliticCards() { 
     return politicCards; 
    } 
    public void setPoliticCards(ArrayList<Color> politicCards) { 
     this.politicCards = politicCards; 
    } 



} 
public class DrawPoliticCard { 
    public DrawPoliticCard(Player player){ 
     PoliticCard politicCard = new PoliticCard();//I know that to 
//call a method from another class you should create an instance, 
//but isn't *new PoliticCard();* creating a new arraylist in PoliticCard()?, 
//what i want is to create the arraylist only once (like it's written in the test below) 
//and then use the same updated arraylist each time i use this constructor 
     player.getPoliticCards().add(politicCard.getPoliticCards().get(0)); 
     politicCard.getPoliticCards().remove(0); 

    } 

} 
public class ModelPlayerTest { 

    @Test 
    public void testDrawCard() { 
     Player player = new Player(1); 
     new PoliticCard(); 
     new DrawPoliticCard(player); 
     assertNotNull(player.getPoliticCards().get(0)); 
    } 


} 
+0

так что вопрос? –

+0

@PriyankaKotari Я хочу заменить 'new PoliticCard()' in 'PoliticCard politicCard = new PoliticCard();' поэтому он не создает нового arraylist каждый раз. – mpz

ответ

1

Единственный способ для вызова метода из класса без использования реального экземпляра этого является вызовом статического метода.

+0

Это неверно. Что относительно статических методов. –

+0

Это неправильно. Что относительно Math.max (int a, int b); Максимальный метод основан не на экземпляре, а на классе. –

1

Вот как вы можете сделать это:

// Fully construct the ArrayList here and it gets created just once per instance. 
private ArrayList<Color> politicCards = new ArrayList<Color>() 
public PoliticCard() { 

    // Get rid of this call 
    // setPoliticCards(new ArrayList<Color>()); 
    politicCards.add(Color.BLACK); 
    politicCards.add(Color.PURPLE); 
} 

EDIT:

Создать один экземпляр PoliticCard в классе DrawPoliticCard и у каждого игрока сделать из того же экземпляра.

public class DrawPoliticCard 
{ 
    final static PoliticCard politicCard = new PoliticCard(); 
    public static void drawCard(Player player) 
    { 
     player.getPoliticCards().add(politicCard.getPoliticCards().get(0)); 
     politicCard.getPoliticCards().remove(0); 
    } 
} 

Использование:

public class ModelPlayerTest { 

    @Test 
    public void testDrawCard() { 
     Player player = new Player(1); 
     Player player2 = new Player(2); 

     // draw a card for player one 
     DrawPoliticCard.drawCard(player); 

     // draw a card for player two 
     DrawPoliticCard.drawCard(player2); 
    } 
} 
+0

но каждый раз, когда я использую конструктор 'new PoliticCard()' в 'DrawCard', вы не добавляете две дополнительные карты? – mpz

+0

@mpz Вы хотите, чтобы все экземпляры PoliticCard делили ArrayList или каждый экземпляр имел свои собственные? Просьба уточнить. –

+0

Я думаю, что я объясню это лучше с помощью этого примера: допустим, конструктор 'PoliticCard' создает arraylist с 5 черными картами и 5 фиолетовыми, когда я использую« DrawCard »с первым игроком, у его арраиста будет добавлена ​​одна черная карта и у arraylist 'PoliticCard' будет 4 черных карты, тогда, когда я использую« DrawCard »со вторым игроком, у его арраиста будет добавлена ​​одна черная карта, а у arraylist« PoliticCard »будет 3 черных карты и т. д. – mpz

0

вы можете реализовать синглтон для PoliticCard:

private static PoliticCard instance = null; 
public static PoliticCard getInstance() 
{ 
    if (instance == null) 
     instance = new PoliticCard(); 
    return instance;  
} 

затем вместо вызова new PoliticCard(); использовать PoliticCard.getInstance();, который будет убедиться, что вы только создать 1 экземпляр PoliticCard

+0

спасибо, но я не могу использовать статические атрибуты – mpz