打字猴:1.70044359e+09
1700443590 编写高质量代码:改善Java程序的151个建议 [:1700438137]
1700443591 编写高质量代码:改善Java程序的151个建议 建议66:asList方法产生的List对象不可更改
1700443592
1700443593 上一个建议指出了asList方法在转换基本类型数组时存在的问题,接着我们看一下asList方法返回的列表有何特殊的地方,代码如下所示:
1700443594
1700443595 enum Week{Sun, Mon, Tue, Wed, Thu, Fri, Sat}
1700443596
1700443597 public static void main(String[]args){
1700443598
1700443599 //五天工作制
1700443600
1700443601 Week[]workDays={Week.Mon, Week.Tue, Week.Wed, Week.Thu, Week.Fri};
1700443602
1700443603 //转换为列表
1700443604
1700443605 List<Week>list=Arrays.asList(workDays);
1700443606
1700443607 //增加周六也为工作日
1700443608
1700443609 list.add(Week.Sat);
1700443610
1700443611 /*工作日开始干活了*/
1700443612
1700443613 }
1700443614
1700443615 很简单的程序呀,默认声明的工作日(workDays)是从周一到周五,偶尔周六也会算作工作日加入到工作日列表中。不过,这段程序执行时会不会有什么问题呢?
1700443616
1700443617 编译没有任何问题,但是一运行,却出现了如下结果:
1700443618
1700443619 Exception in thread”main”java.lang.UnsupportedOperationException
1700443620
1700443621 at java.util.AbstractList.add(AbstractList.java:131)
1700443622
1700443623 at java.util.AbstractList.add(AbstractList.java:91)
1700443624
1700443625 UnsupportedOperationException,不支持的操作?居然不支持List的add方法,这真是奇怪了!还是来追根寻源,看看asList方法的源代码:
1700443626
1700443627 public static<T>List<T>asList(T……a){
1700443628
1700443629 return new ArrayList<T>(a);
1700443630
1700443631 }
1700443632
1700443633 直接new了一个ArrayList对象返回,难道ArrayList不支持add方法?不可能呀!可能,问题就出在这个ArrayList类上,此ArrayList非java.util.ArrayList,而是Arrays工具类的一个内置类,其构造函数如下所示:
1700443634
1700443635 //这是一个静态私有内部类
1700443636
1700443637 private static class ArrayList<E>extends AbstractList<E>
1700443638
1700443639 implements RandomAccess, java.io.Serializable{
[ 上一页 ]  [ :1.70044359e+09 ]  [ 下一页 ]