2015-02-07 159 views
0

我知道这一定是一个基本的设计问题,因为我显然不能这样做。我想根据分配给OwnedSpirits(int)的整数值从另一个类调用ownGrokk,ownTyce等方法。这又将填充数组。这是做什么的正确方法?

问题是,我多次执行此操作,并且从另一个类中执行此操作,似乎每次都必须创建一个新对象来传递新的int参数,并重置spiritInstance的值。而且,由于重置为零,阵列不能正确填充。我稍后尝试打印出我的数组值,并得到一个“ArrayIndexOutOfBoundsException”。

public class OwnedSpirits {  
    private int spiritTypeInt = 0; 

    public static int spiritInstance=0;             
    public static int[] spiritarray = new int[9]; 
    public static String[] spiritName = new String[9]; 
    public static int[] party = new int[3]; 

    public OwnedSpirits(int spiritcall){ 
     if(spiritcall == 1){ 
      ownGrokk(); 
     }  
     if(spiritcall == 2){ 
      ownRisp(); 
     } 
     if(spiritcall == 3){ 
      ownTyce(); 
     } 
     if(spiritcall == 4){ 
      ownDaem(); 
     } 
     if(spiritcall == 5){ 
      ownCeleste(); 
     } 
    } 

    private void ownGrokk(){ 
     spiritName[spiritInstance] = "Grokk"; 
     spiritInstance++;     
    } 

    private void ownRisp(){  
     spiritName[spiritInstance] = "Risp"; 
     spiritInstance++;    
    } 

    private void ownDaem(){ 
     spiritName[spiritInstance] = "Daem"; 
     spiritInstance++;  
    } 

    private void ownCeleste(){ 
     spiritName[spiritInstance] = "Celeste"; 
     spiritInstance++;   
    } 

    private void ownTyce(){ 
     spiritName[spiritInstance] = "Tyce"; 
     spiritInstance++; 
    } 

这个代码是在另一个类,它试图调用的方法来填充数组

buttonConfirm.addListener(new ClickListener(){ 
    @Override 
    public void clicked(InputEvent event, float x, float y) {         
     if(xcounter==3){ 
      for(x=0; x<3; x++){ 
       if(setdaemtrue == true){ 
        new OwnedSpirits(4); 
       } 
       if(setrisptrue == true){ 
        new OwnedSpirits(2); 
       } 
       if(setcelestetrue == true){ 
        new OwnedSpirits(5); 
       } 
       if(settycetrue == true){ 
        new OwnedSpirits(3); 
       } 
       if(setgrokktrue == true){ 
        new OwnedSpirits(1); 
       }  
      } 
     } 
    } 
}); 

终于在另一个类:

System.arraycopy(OwnedSpirits.spiritName, 0, partylist, 0, 3); 

@Override 
public void show() { 
    System.out.println(partylist[0]); 
    System.out.println(partylist[1]); 
    System.out.println(partylist[2]); 

    spiritlist.setItems(partylist); 
    table.add(spiritlist); 
    table.setFillParent(true); 
    stage.addActor(table);  
} 

如果最后部分是令人困惑的,这是因为我正在使用libgdx。打印声明只是为了弄清楚为什么我的清单有错误

+0

你可以做的一件事就是去除复制粘贴代码,使你的整体设计更好。 – emlai 2015-02-07 05:52:50

+0

如果我理解正确,我认为你可以通过使spiritInstance成为一个静态属性来解决你的问题。你的静态数组似乎被设计为追踪所有已构建的“OwnedSpirits”类的所有实例的数据,因此为了正确索引这些数组,需要一个静态计数器,每次构建时都会增加一次。你为什么把'spiritInstance'作为实例属性? – bgoldst 2015-02-07 05:54:07

+0

zenith我不知道你的意思 – 2015-02-07 05:56:57

回答

1

我可以告诉你我将如何处理烈酒和派对。 精神类,包含名称和当前党及其分配到:

package com.stackoverflow.spirit; 

public class Spirit { 
    private String name; 
    private Party party; 
    private SpiritType type; 
    private static int id = 0; 

    public static enum SpiritType { 
     Grokk, Risp, Tyce, Daem, Celeste 
    }; 

    public Spirit(String name, SpiritType type) { 
     create(name, type); 
    } 

    public Spirit(SpiritType type) { 
     create(null, type); 
    } 

    // This is to handle Java inexistance of default parameter values. 
    private void create(String name, SpiritType type) 
    { 
     Spirit.id++; 

     this.name = (name == null) ? (type.name() + " " + id) : name; 
     this.type = type; 
    } 

    public String getName() { 
     return name; 
    } 

    public Party getParty() { 
     return party; 
    } 

    public SpiritType getType() { 
     return type; 
    } 

    /** 
    * Used internally by @see Party 
    * @param party the party this Spirit belongs 
    */ 
    public void setParty(Party party) { 
     this.party = party; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @Override 
    public String toString() 
    { 
     return this.name; 
    } 
} 

最后党类,包含了一组精神的,你可以添加和从党去除精神。

package com.stackoverflow.spirit; 

import java.util.HashSet; 

public class Party { 
    private HashSet<Spirit> spirits = new HashSet<Spirit>(); 
    private static int id = 0; 
    private String name = "Party " + Party.id++;; 

    public Party() { 
    } 

    public Party(String name) { 
     this.name = name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    public void add(Spirit spirit) { 
     if (!spirits.contains(spirit)) { 
      spirits.add(spirit); 

      if (spirit.getParty() != null) { 
       //Remove from previous party to update the other party set 
       spirit.getParty().remove(spirit); 
      } 
      spirit.setParty(this); 
     } else { 
      // throw new SpiritAlreadyOnParty(); 
     } 
    } 


    public void remove(Spirit spirit) 
    { 
     if (spirits.contains(spirit)) 
     { 
      spirit.setParty(null); // You could create a default empty party for "Nature/Neutral" Spirits perhaps :) 
      spirits.remove(spirit); 
     } 
     else { 
      //throw new SpiritNotInParty(); 
     } 
    } 

    public boolean isOnParty(Spirit spirit) { 
     return spirits.contains(spirit); 
    } 

    public ArrayList<Spirit> getSpirits() 
    { 
     return new ArrayList<Spirit>(spirits); 
    } 

    public int getPartySize() { 
     return spirits.size(); 
    } 

    public String getPartyInfo() 
    { 
     StringBuilder builder = new StringBuilder(); 

     builder.append("Party:" + this.name + " Size:" + this.spirits.size() + "\n"); 
     for (Spirit s : spirits) 
     { 
      builder.append(s.getName() + "\n"); 
     } 
     return builder.toString(); 
    } 


    @Override 
    public String toString() 
    { 
     return this.name; 
    } 
} 

这里我用的是精神和党的阶级,你可以添加更多的功能,如党的力量,在党的魔术爱好者,等方面的性能:

package com.stackoverflow.spirit; 

import com.stackoverflow.spirit.Spirit.SpiritType; 

public class Main { 
    public static void main(String[] args) throws java.lang.Exception { 
     Party griffindor = new Party("Griffindor"), slytherin = new Party(
       "Slytherin"); 

     // You can also do for (SpiritType type : SpiritType.values() then 
     // type.ordinal() 
     for (int i = 0; i < SpiritType.values().length; i++) { 
      griffindor.add(new Spirit(SpiritType.values()[i])); 
      slytherin.add(new Spirit(SpiritType.values()[i])); 
     } 

     Spirit mySpirit = new Spirit("NotAHPFan", SpiritType.Celeste); 

     slytherin.add(mySpirit); 

     System.out.println("Name of party:" + mySpirit.getParty().getName()); 
     System.out.println("Is on griffindor?:" 
       + griffindor.isOnParty(mySpirit)); 

     // What now? 
     griffindor.add(mySpirit); 
     System.out.println("Is " + mySpirit.getName() + " on " 
       + slytherin.getName() + "?:" + slytherin.isOnParty(mySpirit)); 

     System.out.println(mySpirit.getName() + " is now on " 
       + mySpirit.getParty() + "\n"); 


     System.out.println(griffindor.getPartyInfo()); 
     System.out.println(slytherin.getPartyInfo()); 
    } 
} 

PD:我不是一个惠普风扇。

+0

当我从市场回家时,我会回顾一下。现在,这里有一个答案! – 2015-02-07 15:55:34

+0

我几乎复制了你的代码来试验它,并且netbeans给了我错误。它告诉我,我不能在Party类中调用像setParty和getParty这样的方法,因为我试图从静态上下文中调用非静态方法。 – 2015-02-07 22:15:47

+0

您首先必须创建Party的一个实例。 Party myParty =新Party(),enemyParty =新Party(); 然后你可以调用myParty.setName(“玩家派对”)或myParty.addSpirit(新的Spirit(SpiritType.Grokk)); getParty()和setParty()是Spirit的方法。 非静态方法是与对象实例的状态一起工作的方法。这将是名称和派对变量等对象属性。为了实现这一点,你需要一个对象的实例,实例化一个对象意味着调用新的操作符来构造一个新的副本,并拥有非静态属性的新副本。 – someoneigna 2015-02-07 23:50:46

相关问题