快速访问超类中私有数组或arraylist的对象项

时间:2018-06-15 09:32:14

标签: java performance inheritance encapsulation

我将对象存储在超类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(Explorer1Type1),但最终在我的实际项目中变得复杂了很多(!)更复杂。)
代码遵循Java设计原则,即类字段应该是私有的,class BaseExplorer<T extends BaseType>不需要知道对象在class Explorer1 extends BaseExplorer<Type1>中的存储方式。但这是以速度,代码简单性和代码美感为代价的。我在这个设计中不喜欢的是:

  1. 使用整数循环变量而不是直接循环 数组:
    Explorer1

  2. BaseExplorer会在每次重复播放时被调用 环。 (好吧,我可以先存储它,但这会使代码均匀 更重,更丑陋。)

  3. for (Type1 obj : explorer.array) { ... }是方法调用,它调用方法explorer.getNumberOfObjects()。因此,另外两个方法调用会花费执行时间。 (我可以避免使用子类的方法,因为它的唯一功能是对Type1的转换,但是我必须在每次使用时进行转换。)
  4. 是否有任何“更便宜”或更快的方法循环遍历所有对象并一个接一个地检索存储在getObject(i)数组中的所有super.getObject(i)个对象?还是有任何完全不同的,更好的设计?

0 个答案:

没有答案