日期:2011-03-22 16:17:00 来源:本站整理
未支持的操作[Java编程]
本文“未支持的操作[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
操纵static(静态)数组Arrays.toList(),大概能将一个数组转换成List,以下所示:
从中可以看出,实际只实现了Collection和List接口的一部份.剩余的办法招致了不受欢送的一种情形,名为UnsupportedOperationException.在下一章里,我们会报告违例的具体情形,但在这里有必要举行一下简单阐明.这里的关键在于“调集接口”,以及新调集库内的另一些接口,它们都包含了“可选的”办法.在实现那些接口的调集类中,大概供应、大概没有供应对那些办法的支持.若调用一个未获支持的办法,就会招致一个UnsupportedOperationException(操作未支持违例),这表明呈现了一个编程错误.//: Unsupported.java // Sometimes methods defined in the Collection // interfaces don't work! package c08.newcollections; import java.util.*; public class Unsupported { private static String[] s = { "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", }; static List a = Arrays.toList(s); static List a2 = Arrays.toList( new String[] { s[3], s[4], s[5] }); public static void main(String[] args) { Collection1.print(a); // Iteration System.out.println( "a.contains(" + s[0] + ") = " + a.contains(s[0])); System.out.println( "a.containsAll(a2) = " + a.containsAll(a2)); System.out.println("a.isEmpty() = " + a.isEmpty()); System.out.println( "a.indexOf(" + s[5] + ") = " + a.indexOf(s[5])); // Traverse backwards: ListIterator lit = a.listIterator(a.size()); while(lit.hasPrevious()) System.out.print(lit.previous()); System.out.println(); // Set the elements to different values: for(int i = 0; i < a.size(); i++) a.set(i, "47"); Collection1.print(a); // Compiles, but won't run: lit.add("X"); // Unsupported operation a.clear(); // Unsupported a.add("eleven"); // Unsupported a.addAll(a2); // Unsupported a.retainAll(a2); // Unsupported a.remove(s[0]); // Unsupported a.removeAll(a2); // Unsupported } } ///:~
大家大概会认为奇特,不是说“接口”和底子类最大的“卖点”就是它们答应这些办法能产生一些有意义的行为吗?上述违例破坏了那个答应——它调用的一部份办法不但不能产生有意义的行为,并且还会中止程序的运行.在这些情形下,范例的所谓安全保证仿佛显得一钱不值!但是,情形并没有想象的那么坏.通过Collection,List,Set大概Map,编译器仍旧限制我们只能调用那个接口中的办法,所以它和Smalltalk还是存在一些辨别的(在Smalltalk中,可为任何对象调用任何办法,并且只有在运路程序时才知道这些调用能否可行).除此以外,以Collection作为自变量的大大都办法只能从那个调集合读取数据——Collection的全部“read”办法都不是可选的.
这样一来,系统便可避免在计划期间呈现接口的冲突.而在调集库的其他计划筹划中,终究常常城市得到数目过量的接口,用它们描写基本筹划的每一种改变情势,所以学习和掌握显得非常艰难.有些时刻,乃至难于捕捉接口中的全部特别情形,因为人们大概计划出任何新接口.但Java的“不支持的操作”办法却到达了新调集库的一个重要计划目标:易于学习和利用.但是,为了使这一办法真正有效,却需满意下述条件:
(1) UnsupportedOperationException必须属于一种“非常”事件.也就是说,关于大大都类来说,全部操作都应是可行的.只有在一些特别情形下,1、两个操作才大概未获支持.新调集库满意了这一条件,因为绝大大都时刻用到的类——ArrayList,LinkedList,HashList和HashMap,以及其他调集筹划——都供应了对全部操作的支持.但是,假如想新建一个调集,同时不想为调集接口中的全部办法都供应有意义的定义,同时令其仍与现有库配合,这种计划办法也确切供应了一个“后门”可以操纵.
(2) 若一个操作未获支持,那么UnsupportedOperationException(未支持的操作违例)极有大概在实现期间呈现,则不是在产品已拜托给客户今后才会呈现.它毕竟指出的是一个编程错误——不精确地利用了一个类.这一点不能非常肯定,通过也可以看出这种筹划的“试验”特点——只有经过多次试验,才能找出最抱负的工作方法.
在上面的例子中,Arrays.toList()产生了一个List(列表),该列表是由一个固定长度的数组后推出来的.因此唯一可以支持的就是那些不改变数组长度的操作.在另一方面,若恳求一个新接口表达差别种类的行为(大概叫作“FixedSizeList”——固定长度列表),就有遭受更大的复杂程度的危险.这样一来,今后试牟利用库的时刻,很快就会发现自己不知从何处下手.
对那些采取Collection,List,Set大概Map作为参数的办法,它们的文档该当指出哪些可选的办法是必须实现的.举个例子来说,排序要务实现set()和Iterator.set()办法,但不包含add()和remove().
以上是“未支持的操作[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
- ·上一篇文章:java的排序和搜索
- ·下一篇文章:决意实施策划
- ·中查找“未支持的操作”更多相关内容
- ·中查找“未支持的操作”更多相关内容
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论