《Effective Java》条款54:返回一个长度为零的数组或集合而不是null1.问题如果一个方法的返回类型是list,如果结果为空返回null的情况并不少见,如下:publicclassShop_Version1{privatefinalListcheesesInStock=newArrayList<>();publicShop_Version1(booleaninitFlag){if(initFlag){cheesesInStock.add(Cheese.STILION);/***@return包含商店中所有奶酪的列表,如果没有奶酪可供购买,则返回null。*/publicListgetCheeses(){returncheesesInStock.isEmpty()?null:newArrayList<>(cheesesInStock);}}这样有个缺点:调用这个方法的地方必须处理null返回值,容易出错。有人认为这样做的好处是:这样做避免了分配零长度容器所需的开销。这种说法是站不住脚的,首先,这个级别的性能不用担心。其次,你不需要分配零长度的集合或数组,你可以按如下方式返回它们:publicShop_Version2(booleaninitFlag){if(initFlag){cheesesInStock.add(Cheese.STILION);/***@return包含商店中所有奶酪的列表,*如果没有奶酪可供购买,则返回空列表。*/publicListgetCheeses(){returnnewArrayList<>(cheesesInStock);}}二。分析2.1返回集合的优化如果分配一个零长度集合确实伤害了程序的性能,你可以重复返回一个不可变的零长度集合来避免分配实现,因为不可变对象可以自由共享。如果你返回一个集合,你可以使用Collections.emptySet()或Collections.emptyList();如果返回地图,可以使用Collections.emptyMap()。这是一个优化,但很少使用,如下:publicclassShop_Version3{privatefinalListcheesesInStock=newArrayList<>();publicShop_Version3(booleaninitFlag){if(initFlag){cheesesInStock.add(Cheese.}}/***@return包含商店中所有奶酪的列表,*如果没有奶酪可供购买,则为空列表。*/publicListgetCheeses(){returncheesesInStock.isEmpty()?Collections.emptyList():newArrayList<>(cheesesInStock);}}2.2返回数组的情况返回数组和返回集合是一样的,它永远不会返回null,而是返回一个零长度数组。publicclassShop_RetArray_Version1{privatefinalListcheesesInStock=newArrayList<>();publicShop_RetArray_Version1(booleaninitFlag){if(initFlag){cheesesInStock.add(Cheese.STILION);/***@return一个包含商店中所有奶酪的数组,*如果没有奶酪可供购买,则返回一个空数组。*/publicCheese[]getCheeses(){returncheesesInStock.toArray(newCheese[0]);}}如果你想创建一个自变量toArray,将它设置为一个数组,如果:publicShop_RetArray_Version2(booleaninitFlag){if(initFlag){cheesesInStock.add(Cheese.STILION);/***@return一个包含商店中所有奶酪的数组,*如果没有奶酪可供购买,则返回一个空数组。*/publicCheese[]getCheeses(){{返回cheesesInStock.toArray(新奶酪[cheesesInStock.size()]);}}2.3返回数组的优化如果分配零长度数组有损性能,可以重复返回同一个零长度数组,因为所有的零长度数组都是不可变的,如下:publicclassShop_RetArray_Version3{privatefinalListcheesesInStock=newArrayList<>();privatestaticfinalCheese[]EMPTY_CHEESE_ARRAY=newCheese[0];publicShop_RetArray_Version3(booleaninitFlag){lag(initFlag)){cheesesInStock.add(Cheese.STILION);/***@return包含商店中所有奶酪的数组,如果没有奶酪可供购买,则返回空数组。*/publicCheese[]getCheeses(){returncheesesInStock.toArray(EMPTY_CHEESE_ARRAY);}}3.总结总之,永远不要返回null,而是返回一个零长度的数组或集合。返回null将使API更难使用且更容易出错,并且没有性能优势。