我将对象存储在超类BaseType
的{{1}}数组中,我希望从子类BaseExplorer
中尽可能高效地检索 并使用它们作为Explorer1
对象。 (Type1
)所有字段都是私有的。 Type1 extends BaseType
不需要(需要)了解对象在Explorer1
中的存储方式。
BaseExplorer
我之所以选择此设计,是因为// data object classes
abstract class BaseType {}
class Type1 extends BaseType {}
class Type2 extends BaseType {} // etc. (many TypeX classes)
// superclass storing the data objects with many methods manipulating them
abstract class BaseExplorer {
private BaseType[] array; // Array of BaseType-Objects
private List<BaseType> list; // alternatively a List or ArrayList
public int getNumberOfObjects() {
return array.length; // or list.size() or whatever
}
public BaseType getObject(int i) {
return array[i]; // or list.get(i) or whatever
}
// followed by many methods that are reused by all subsclasses Explorer1 ... ExplorerX
}
// one of many ExplorerX subclasses with their own TypeX data objects
class Explorer1 extends BaseExplorer {
public Type1 getObject(int i) {
return (Type1) super.getObject(i);
}
// followed by many methods that use the Type1 data objects
}
public static void main(String[] args) {
Explorer1 explorer = new Explorer1();
// followed by code constructing the Type1 objects in explorer which fill the array/list in Explorer
// Virtually looping through the private array/list of Explorer1 and retrieving Type2 objects
for (int i=0; i<explorer.getNumberOfObjects(); i++) {
Type1 obj = explorer.getObject(i);
// followed by code using obj as Type1 ...
}
}
中的方法将对象用作BaseExplorer
个对象(BaseType
不知道BaseExplorer
)以及{{1}中的方法将它们用作Type1
个对象。或者,我尝试过使用Java Generics(Explorer1
和Type1
),但最终在我的实际项目中变得复杂了很多(!)更复杂。)
代码遵循Java设计原则,即类字段应该是私有的,class BaseExplorer<T extends BaseType>
不需要知道对象在class Explorer1 extends BaseExplorer<Type1>
中的存储方式。但这是以速度,代码简单性和代码美感为代价的。我在这个设计中不喜欢的是:
使用整数循环变量而不是直接循环
数组:
Explorer1
BaseExplorer
会在每次重复播放时被调用
环。 (好吧,我可以先存储它,但这会使代码均匀
更重,更丑陋。)
for (Type1 obj : explorer.array) { ... }
是方法调用,它调用方法explorer.getNumberOfObjects()
。因此,另外两个方法调用会花费执行时间。 (我可以避免使用子类的方法,因为它的唯一功能是对Type1的转换,但是我必须在每次使用时进行转换。)是否有任何“更便宜”或更快的方法循环遍历所有对象并一个接一个地检索存储在getObject(i)
数组中的所有super.getObject(i)
个对象?还是有任何完全不同的,更好的设计?