美好的一天,我有一些设计问题,我无法真正理解,我希望我能清楚地解释清楚,让所有人明白。我有一个ClassA,它是一个包含ClassB的Arraylist的单例,所以ClassA是:
private classA(){
//private constructor
}
public static synchronized classA getClassA(){
if(ClassA == null){
ClassA = new ClassA();
}
return ClassA;
}
private ArrayList<ClassB> classb = new ArrayList<ClassB>(5);
public ArrayList<ClassB> getClassB(){
return this.classb;
}
public ClassB getLastClassB() {
return this.classb.get(this.classb.size() - 1);
}
在ClassB中,我有一个ClassD的ArrayList,其中ClassD只是一类getter和setter,所以我的ClassB是:
public ClassB() {
}
private ArrayList<ClassD> classd = new ArrayList<ClassD>();
public ArrayList<ClassD> getClassD(){
return this.ClassD;
}
public ClassD getLastClassD() {
return this.ClassD.get(this.ClassD.size() - 1);
}
这样当我想要使用classB和classD对象的ClassA对象中的列表时,我会
ClassA A = ClassA.getClassA();
Class B B = new ClassB();
ClassD D = new ClassD();
//do some setters here for D
B.getClassD.add(D)
// do some things in B
A.getClassB.add(B)
但是当我尝试在另一个类中访问它时,我得到一个java.lang.IndexOutOfBoundsException:Index:0,Size:0我猜这是来自持有ClassD的ArrayList的ClassB,因为其他功能正在运行.. < / p>
for(int i = 0; i < classA.getClassB.size(); i++)
if(classA.getClassB().get(i).getClassD().size() > 0){ //java.lang.indexOutOfBoundsException
任何想法可能是错误的还是我的设计实现方式?我不能使ClassB成为另一个Singleton因为那样我将在ArrayList ClassA中拥有相同的ClassB对象。有没有更好的实施的想法?..非常感谢提前。
答案 0 :(得分:0)
抱歉,但我需要提高英语水平。
问题应该如下: 如果getclassb返回一个B数组,但其中一个没有初始化,那么你执行.getClassD然后java抛出异常
答案 1 :(得分:0)
在this.ClassD.get(this.ClassD.size() - 1)
和另一个类似的代码行中,size()
调用是否始终保证返回大于零的值?换句话说,你能保证列表总是至少有一个元素吗?显然不是,所以是的,这是一个糟糕的设计。
您的getLastClassX()
方法应该准备好返回null
,因此在尝试获取大小() - 1的项目之前,请在列表中调用!isEmpty()
。