【发布时间】:2015-02-07 05:46:39
【问题描述】:
我知道这一定是一个基本的设计问题,因为我显然无法做到这一点。我想根据分配给 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。打印语句只是为了找出我的列表出现错误的原因
【问题讨论】:
-
为了使整体设计更好,您可以做的一件事是删除复制粘贴代码。
-
如果我理解正确,我认为您可以通过将
spiritInstance设为静态属性来解决您的问题。您的静态数组似乎旨在跟踪有关已构造的OwnedSpirits类的所有实例的数据,因此要正确索引这些数组,您需要一个静态计数器,每次构造都会递增一次。为什么将spiritInstance设为实例属性? -
天顶我不明白你的意思
-
您的代码的一个奇怪方面是您的静态数组的长度不同。如果您尝试在每个静态数组中分配足够的空间来保存所有可能分配的实例上的数据,为什么它们的长度会不同?
party数组只有 3 个元素,而spiritarray和spiritName是 9。这些应该是统一的长度,在构造函数中可能应该有一个断言,你不会超过那个最大值,当你打印,你应该确保不超过最大值(或实际分配的实例数)。 -
bgold 它实际上是静态的,我在尝试将代码格式化到这篇文章中时不小心删除了它是静态的。我在格式化它时遇到了一些问题。