char[] arrNew = new char[0];
System.out.println(arrNew.length); // length = 0
arrNew[0]='c'; // ArrayIndexOutOfBoundsException .
Run Code Online (Sandbox Code Playgroud)
在上面的代码中你可以清楚地看到,有一个大小为0的数组是没有意义的.据我所知,没有0大小数组的实际用法.有人可以解释为什么编译器允许创建0长度数组.还有一个0长度数组与初始化为null的数组有何不同?(即,分配给它的内存就好像它是一个普通的数组?).如果这个问题看起来很愚蠢,我很抱歉.
我们可以从方法返回一个空数组而不是null,这称为Null对象设计模式.请考虑以下代码
Person[] res = find(name);
for(String e : res) {
System.out.println(e);
}
Run Code Online (Sandbox Code Playgroud)
如果find()找不到任何人,则返回一个空数组.如果find返回null,则代码需要将其视为特殊情况.
我们应该记住,空数组是不可变的,因此使用单例而不是每次创建它都是合乎逻辑的
private static final Person[] NULL = new Person[0];
Person[] find(String name) {
...
if (notFound) {
return NULL;
}
...
Run Code Online (Sandbox Code Playgroud)
最好不要从返回数组类型的方法中返回 null。始终返回一个数组,即使数组的长度为零,也大大提高了算法的通用性。如果您预计您的方法将频繁返回零长度数组,您可能会担心分配许多此类数组对性能的影响。要解决这个问题,只需分配一个数组,并始终返回相同的数组,例如:
private static final int ZERO_LENGTH_ARRAY[] = new int[0];
Run Code Online (Sandbox Code Playgroud)
该数组是不可变的(无法更改),并且可以在整个应用程序中共享。
因此,在空对象模式中,空对象代替了对空对象实例的检查。空对象反映了一种不执行任何操作的关系,而不是检查是否为空值。此类 Null 对象还可用于在数据不可用时提供默认行为。
| 归档时间: |
|
| 查看次数: |
528 次 |
| 最近记录: |