2016-06-04 7 views
0

Ich habe die Methode drawPoliticCard(), die ich in der Methode von einer anderen Klasse applyBonus() verwenden muss, kann ich es leicht mit einem statischen Attribut tun, aber das Problem ist, dass ich in der Lage sein, zwei Instanzen von auszuführen das Spiel unabhängig zur gleichen Zeit, so wenn beide statisch beide Instanzen das gleiche Kartenspiel teilen. Deshalb wollte ich wissen, ob es einen Weg gibt, dies zu tun, ohne ein statisches Attribut zu verwenden. Ich werde die Getter und Setter der Attribute weglassen, um es prägnanter zu machen.Java, das keine statische Variable verwendet

public class PoliticCard { 
    private static ArrayList<Color> politicCards; 

    public void setDeck(){ 
     setPoliticCards(new ArrayList<Color>()); 
      getPoliticCards().add(Color.BLACK); 
      getPoliticCards().add(Color.PURPLE); 
      getPoliticCards().add(Color.BLUE); 
    } 
    public static void drawPoliticCard(Player player){ 
     player.getPoliticCards().add(getPoliticCards().get(0)); 
     getPoliticCards().remove(0); 
    } 
} 

public class Bonus { 
    protected int number;//The number of politic cards added in BonusPoliticCard 
} 

public class BonusPoliticCard extends Bonus { 
    public BonusPoliticCard(int number) { 
     this.number=number; 
    } 
    public void applyBonus(Player player){ 
     int i=0; 
     while(i<number){ 
      PoliticCard.drawPoliticCard(player); 
      i++; 
     } 
    } 

} 

Ich weiß, dass eine Methode aus einer anderen Funktion aufrufen Sie eine neue Instanz der Klasse erstellen sollten, aber wenn ich, dass ich ein nullpointerexception erhalten tun, wenn die Prüfung.

public class BonusPoliticCard extends Bonus { 
    public BonusPoliticCard(int number) { 
     this.number=number; 
    } 
    public void applyBonus(Player player){ 
     int i=0; 
     while(i<number){ 
      PoliticCard politicCard = new PoliticCard(); 
      politicCard.drawPoliticCard(player); 
      i++; 
     } 
    } 

} 

public class BonusPoliticCardTest { 

    @Test 
    public void testBonusPoliticCard() {//This ran fine when it was static 
     Bonus bonus = new BonusPoliticCard(3); 
     Player player = new Player(1); 
     PoliticCard politicCard = new PoliticCard(); 
     politicCard.setDeck(); 
     bonus.applyBonus(player); 
     assertNotNull(player.getPoliticCards().get(2)); 

    } 

} 
+0

Können Sie Stack-Trace schreiben? – hubot

+1

Wo ist Ihre Hauptmethode? Schau dir [mcve] an. – Gendarme

+1

Haben Sie zwei Konten oder arbeiten Sie an demselben Code wie dieser andere Benutzer? http://stackoverflow.com/questions/37597778/java-calling-a-method-without-creating-an- instance –

Antwort

0

Da Spielerklasse wird in dem Problem nicht gezeigt, gibt es zwei Fälle, in denen Nullpointer geworfen werden können:

(1) PoliticCard Instanz in BonusPoliticCardTest erstellt von der Instanz unterscheidet man in BonusPoliticCard Klasse erstellen. Die policyCards arrayList, die Sie über politicipardCard.setDeck() in BonusPoliticCardTest setzen, ist also nie mit einer PoliticCard-Instanz verfügbar, die Sie innerhalb der BonusPoliticCard-Klasse erstellen. Beachten Sie auch, dass die policyCards arrayList der PoliticCard-Instanz sowohl erstellt als auch in setDeck() gesetzt ist. Also, während des Aufrufs zu bonus.applyBonus (Spieler); die politicCards Arraylist Referenzpunkte auf null, daher Nullpointer wird auf folgende Zeile für getPoliticCards() geworfen werden erhalten (0):.

player.getPoliticCards().add(getPoliticCards().get(0)); // inside drawPoliticCard(Player player) method 

(2) Spieler Klasse Arraylist politicCards in seinem Konstruktor erstellt haben, sollten wir sonst bekommen NullPointerException in der folgenden Zeile für player.getPoliticCards(). Add (...):

player.getPoliticCards().add(getPoliticCards().get(0)); // inside drawPoliticCard(Player player) method 

Hier ist die korrekte Codebeispiel:

PoliticCard.java

public class PoliticCard { 
    private ArrayList<Color> politicCards; 

    /** 
    * @return the politicCards 
    */ 
    public ArrayList<Color> getPoliticCards() { 
     return politicCards; 
    } 
    /** 
    * @param politicCards the politicCards to set 
    */ 
    public void setPoliticCards(ArrayList<Color> politicCards) { 
     this.politicCards = politicCards; 
    } 

    public void setDeck() { 
     setPoliticCards(new ArrayList<Color>()); 
     getPoliticCards().add(Color.BLACK); 
     getPoliticCards().add(Color.PURPLE); 
     getPoliticCards().add(Color.BLUE); 
    } 

    public void drawPoliticCard(Player player) { 
     player.getPoliticCards().add(getPoliticCards().get(0)); 
     getPoliticCards().remove(0); 
    } 

} 

Bonus.java:

public class Bonus { 
    protected int number; //The number of politic cards added in BonusPoliticCard 
} 

BonusPoliticCard.java

public class BonusPoliticCard extends Bonus { 
    PoliticCard politicCard; 
    public BonusPoliticCard(int number, PoliticCard politicCard) { 
     this.number=number; 
     this.politicCard = politicCard; 
    } 
    public void applyBonus(Player player){ 
     int i=0; 
     while(i<number){ 
      politicCard.drawPoliticCard(player); 
      i++; 
     } 
    } 
} 

Player.java

public class Player { 
    private ArrayList<Color> politicCards; 
    int num; 

    public Player(int num) { 
     this.num = num; 
     politicCards = new ArrayList<Color>(); 
    } 

    /** 
    * @return the politicCards 
    */ 
    public ArrayList<Color> getPoliticCards() { 
     return politicCards; 
    } 

    /** 
    * @param politicCards the politicCards to set 
    */ 
    public void setPoliticCards(ArrayList<Color> politicCards) { 
     this.politicCards = politicCards; 
    } 
} 

BonusPoliticCardTest.java

public class BonusPoliticCardTest { 

    @Test 
    public void test() { 
     PoliticCard politicCard = new PoliticCard(); 
     politicCard.setDeck(); 
     Bonus bonus = new BonusPoliticCard(3, politicCard); 
     Player player = new Player(1); 
     ((BonusPoliticCard) bonus).applyBonus(player); 
     assertNotNull(player.getPoliticCards().get(2)); 
    } 

} 
0

Sie können eine Instanz der Klasse PoliticCard in einem Konstruktor der Klasse Bonus erstellen. So werden Sie in der Lage sein, sie zusammen zu verwenden, und auch mehrere Instanzen des Spiels zu erstellen:

public class BonusPoliticCard extends Bonus { 
    PoliticCard p; 
    public BonusPoliticCard(int number) { 
     this.number=number; 
     p = new PoliticCard(); 
    } 
    public void applyBonus(Player player){ 
     int i=0; 
     while(i<number){ 
      p.drawPoliticCard(player); 
      i++; 
     } 
    } 

} 
+0

Ich bekomme immer noch den gleichen Fehler, ist das nicht, weil die 'neue PoliticCard();' in 'BonusPoliticCard' eine andere Instanz von' PoliticCard' erstellt und nicht die im Test 'PoliticCard erstellte Instanz verwendet politicCard = new PoliticCard(); '? (tut mir leid, aber es gab einen Fehler vorher in der Zeit sollte es sein, während (i

0

Ich bin etwas verwirrt mit Ihrem Code-Design, ich habe folgende Bedenken -

  1. Gemäß dem Namen der Klasse - BonusPoliticCard, Es sollte die Klasse PoliticCard erweitern. BonusPoliticCard extends PoliticCard macht mehr Sinn.
  2. Brauchen wir wirklich Bonus-Klasse, um nur die Anzahl der in BonusPoliticCard hinzugefügten Karten zu behalten. Meiner Meinung nach, wenn Bonus-Klasse benötigt wird, dann denke ich sollte es eine HAS-A-Beziehung zwischen PoliticCard und Bonus geben. PoliticCard HAS-A BONUS.
  3. Wir sollten den Einsatz von Statik generell vermeiden, sofern sie nicht wirklich benötigt werden. Wenn wir denken, dass wir Statik brauchen, dann sollten wir wirklich immer wieder an die Anforderung und das Design denken, dann sollten wir uns nur für Statik entscheiden. Für Nutzungsklassen können wir uns für Statik entscheiden. Ich fand einen nützlichen Artikel zu diesem here.

Also meiner Meinung nach sollten Sie noch einmal an Ihr Design denken. Meine Antwort basiert nur auf dem bereitgestellten Code.

+0

Gute Vorschläge. Vielleicht kannst du die Frage auch beantworten? –

+0

BonusPoliticClass ist eine Unterklasse des Bonus, weil es verschiedene Arten von Bonus gibt, ich habe Probleme mit diesem Bonus, insbesondere weil er eine Methode aus einer anderen Klasse mehrmals aufruft, der andere Bonus ändert nur die Werte der Attribute der Klasse 'Player ', kein Bonus hat auch alle anderen Attribute, die in den anderen Arten von Bonus verwendet werden, ich setze nur Zahl, weil es das Attribut ist, das in' BonusPoliticCard' verwendet wird –