国庆期间技术精进08:返回零长度的数组或者集合,而不是null

166 阅读2分钟

本月决定重新看一下Effective Java中文版这本书,推荐学习技术的朋友阅读,本书以一种比较自由的方式将一些开发遇到的问题组织成10章,每一章都涉及软件涉及的一个主要方面,对我们学习和工作很有帮助。那我们闲话少说,国庆技术精进继续!!!

有时候会有人认为:null返回值比零长度数据更好,因为它避免了分配数组所需要的开销。 这种观点是站不住脚的,原因有两点。

  • 在这个级别上担心性能问题是不明智的,除非分析表明这个方法正是造成性能问题的真正源头。

  • 对于不返回任何元素的调用,每次都返回同一个零长度数组是有可能的,因为零长度数组是不可变的,而不可变对象有可能被自由地共享。

示例代码如下:

private static final Cheese[] EMPTY_CHEESE_ARRAY= new Cheese[0];
public static void main(String[] args) {
   List<String>_elements = getAllElemnts();
   if(_elements.isEmpty()) {
     System.out.println("十一国庆节!");
   }
}
 
public List<String> getAllElements() {
  return null;
}
  • 返回值为数组时,应返回零长度数组,代码为:

    public static void main(String[] args) {
       List<String> elements = getElemnts();
       if( elements.isEmpty()) {
         System.out.println("十一国庆节!");
       }
    }
    public List<String> getElements() {
      return new String[0];
    }

  • 优化: 每次都要初始化一个零长度的数组,为避免这种资源的浪费,可以再类中定义一个静态变量即为:
public static void main(String[] args) {
   String[] elements = getElemnts();
   if(elements.isEmpty()) {
     System.out.println("十一国庆节!");
   }
}
 
public String[] getElements() {
  return EMPTY_STR;
}
 
private static final String[] EMPTY_STR = new String[0];
  • 返回空list、set、map

在项目开发中,大多使用Collection,如Set,Map等,当返回值为空List是返回Collections.emptyList(),Collections库里也有emptyMap(), emptySet(),代码如下:

Collections.emptyList()
Collections.emptySet();
Collections.emptyMap();
public static void main(String[] args) {
   Map<String> elements = getElemnts();
   if(_elements.isEmpty()) {
     System.out.println("十一国庆节!");
   }
}
 
public Map<String> getElements() {
  return Collections.emptyMap();
}

public static void main(String[] args) {
   Set<String>_elements = getElemnts();
   if(_elements.isEmpty()) {
     System.out.println("十一国庆节!");
   }
}
 
public List<String> getElements() {
  return Collections.emptySet();
}