这是做什么的正确方法?
我知道这一定是一个基本的设计问题,因为我显然不能这样做。我想根据分配给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。打印声明只是为了弄清楚为什么我的清单有错误
我可以告诉你我将如何处理烈酒和派对。 精神类,包含名称和当前党及其分配到:
package com.*.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.*.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.*.spirit;
import com.*.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:我不是一个惠普风扇。
当我从市场回家时,我会回顾一下。现在,这里有一个答案! – 2015-02-07 15:55:34
我几乎复制了你的代码来试验它,并且netbeans给了我错误。它告诉我,我不能在Party类中调用像setParty和getParty这样的方法,因为我试图从静态上下文中调用非静态方法。 – 2015-02-07 22:15:47
您首先必须创建Party的一个实例。 Party myParty =新Party(),enemyParty =新Party(); 然后你可以调用myParty.setName(“玩家派对”)或myParty.addSpirit(新的Spirit(SpiritType.Grokk)); getParty()和setParty()是Spirit的方法。 非静态方法是与对象实例的状态一起工作的方法。这将是名称和派对变量等对象属性。为了实现这一点,你需要一个对象的实例,实例化一个对象意味着调用新的操作符来构造一个新的副本,并拥有非静态属性的新副本。 – someoneigna 2015-02-07 23:50:46
你可以做的一件事就是去除复制粘贴代码,使你的整体设计更好。 – emlai 2015-02-07 05:52:50
如果我理解正确,我认为你可以通过使spiritInstance成为一个静态属性来解决你的问题。你的静态数组似乎被设计为追踪所有已构建的“OwnedSpirits”类的所有实例的数据,因此为了正确索引这些数组,需要一个静态计数器,每次构建时都会增加一次。你为什么把'spiritInstance'作为实例属性? – bgoldst 2015-02-07 05:54:07
zenith我不知道你的意思 – 2015-02-07 05:56:57