2009-10-14 23 views
0

如果您对故事不感兴趣,请跳过前两段。Subclassing Array

我是说一个有关数组的朋友,为什么他们如果您尝试访问的对象,它是出在像Objective C的“现代”语言界限的(这是我的主要语言)(仍然)坠毁。所以我们进入了一场辩论,我说我可以给他写一个数组(我命名为GeniusArray),它返回null,如果你尝试访问某些界限但不会崩溃,则会输出一个错误。

睡在它之后,我意识到,如果你正在访问界限以外的元素,你在你的代码中的一些严重错误,它的也许不是坏的应用程序崩溃等你拿不得不解决它。 :-D

但还是:我想证明我的观点和继承一个数组,并声明,如果每一个程序员编写相对频繁基本上加入这一个覆盖get()方法:

// Pseudo code... 
if (index < array.count) element= array[index]; 

我想用Java而不是Objective C来做,因为这就是我的朋友“知道”(顺便说一下,我们都是学生)。

长话短说:我尝试了一个数组的子类,但它似乎不工作。我得到这个婷:

访问限制: 类型Attribute.Array是无法访问的原因 所需的库限制: /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0 /Classes/classes.jar GeniusArray.java

+1

“我意识到,如果你正在访问界限以外,你有你的代码中的一些严重错误的元素和它也许不是坏的应用程序崩溃等你拿被迫修复:-D。” - 这是一个非常正确的观察。如果你有一个大小为0的'GeniusArray'并且说'geniusArray [0]。foo()',程序仍然会崩溃,但是可调试的'NullPointerException'少得多,而不是更通信的'ArrayIndexOutOfBoundsException'。返回'null'永远不是处理编程错误的方式 - 抛出是。 – gustafc 2009-10-14 07:59:53

+0

C和C++的真正问题,正如你所说的Objective C一样,它们没有检测到索引超出范围。所以,而不是一个保证崩溃的事情会发生。这更糟糕,例如它会导致所有这些缓冲区溢出安全漏洞。 – starblue 2009-10-14 08:44:17

回答

1

诸如C,C++和Objective-C等语言不检查数组边界(从而导致不可预测行为,如果您尝试访问具有无效索引的数组)出于性能原因。

Java那样在每个阵列访问检查数组边界,如果你使用一个无效的指数,你会得到一个ArrayIndexOutOfBoundsException。有些人认为,由于Java中的内置检查数组效率低于其他编程语言。

+0

我使用try/catch块来捕获java.lang.IndexOutOfBoundsException,并且应用程序没有崩溃(这是我想要的)。看起来这是更好的方式来处理我在Java中使用GeniusArray所做的事情。谢谢。 – Chilloutman 2009-10-14 08:56:34

1

是的。正如你发现你不能从一个数组中继承。你必须从(比如说)ArrayList中继承子类,并使用Decorator模式来截获get()方法(和相关的)。

可惜你不能为[]的操作符重载要么,所以你会从你原来的目标有一定距离。

+0

谢谢。我会看看这个装饰模式。 – Chilloutman 2009-10-14 08:00:33

1

据我回忆,你真的不能在Java中继承一个数组(这是一种特殊类型)。虚拟机对有关子类化的数组做了一些假设。

通常,我会尽量远离数组。改用ArrayLists。

3

只有也可以子类。数组类型不是类。 (从here:“有三种引用类型:类类型,接口类型和数组类型”)

+0

哦,这很有趣!我假设Array是一个类,就像Objective C中的“NSArray”类。我看到我必须学习很多关于Java的知识。 – Chilloutman 2009-10-14 08:10:53