使用长度为0的数组?

The*_*ind 4 java arrays

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的数组有何不同?(即,分配给它的内存就好像它是一个普通的数组?).如果这个问题看起来很愚蠢,我很抱歉.

Evg*_*eev 6

我们可以从方法返回一个空数组而不是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)


Nam*_*mbi 5

最好不要从返回数组类型的方法中返回 null。始终返回一个数组,即使数组的长度为零,也大大提高了算法的通用性。如果您预计您的方法将频繁返回零长度数组,您可能会担心分配许多此类数组对性能的影响。要解决这个问题,只需分配一个数组,并始终返回相同的数组,例如:

private static final int ZERO_LENGTH_ARRAY[] = new int[0];
Run Code Online (Sandbox Code Playgroud)

该数组是不可变的(无法更改),并且可以在整个应用程序中共享。

因此,在空对象模式中,空对象代替了对空对象实例的检查。空对象反映了一种不执行任何操作的关系,而不是检查是否为空值。此类 Null 对象还可用于在数据不可用时提供默认行为。

  • +1 如果您提到“空对象设计模式”,您可能会获得更多的支持。SO 社区显然认为编写“设计模式”的能力使你成为软件开发的半神之一:) (2认同)