|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
java也能做一些底层语言开发做的事情(难度很高,不是java顶尖高手是做不来的),
使用static(静态)数组Arrays.toList(),大概能将一个数组转换成List,以下所示:- //:Unsupported.java
- //SometimesmethodsdefinedintheCollection
- //interfacesdontwork!
- packagec08.newcollections;
- importjava.util.*;
- publicclassUnsupported{
- privatestaticString[]s={
- "one","two","three","four","five",
- "six","seven","eight","nine","ten",
- };
- staticLista=Arrays.toList(s);
- staticLista2=Arrays.toList(
- newString[]{s[3],s[4],s[5]});
- publicstaticvoidmain(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]));
- //Traversebackwards:
- ListIteratorlit=a.listIterator(a.size());
- while(lit.hasPrevious())
- System.out.print(lit.previous());
- System.out.println();
- //Settheelementstodifferentvalues:
- for(inti=0;i<a.size();i++)
- a.set(i,"47");
- Collection1.print(a);
- //Compiles,butwontrun:
- lit.add("X");//Unsupportedoperation
- 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接口的一部分。残剩的办法招致了不受接待的一种情形,名为UnsupportedOperationException。鄙人一章里,我们会报告背例的具体情形,但在这里有需要举行一下复杂申明。这里的关头在于“汇合接口”,和新汇合库内的另外一些接口,它们都包括了“可选的”办法。在完成那些接口的汇合类中,大概供应、大概没有供应对那些办法的撑持。若挪用一个未获撑持的办法,就会招致一个UnsupportedOperationException(操纵未撑持背例),这标明呈现了一个编程毛病。
人人也许会以为奇异,不是说“接口”和基本类最年夜的“卖点”就是它们允诺这些办法能发生一些成心义的举动吗?上述背例损坏了谁人允诺——它挪用的一部分办法不但不克不及发生成心义的举动,并且还会中断程序的运转。在这些情形下,范例的所谓平安包管仿佛显得无价之宝!可是,情形并没有设想的那末坏。经由过程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()。
C++编译的是本地码,优点是启动快,而且可以精确控制资源因此可以开发很高效的程序.缺点是编程麻烦,而且容易留下安全隐患.跨平台靠源代码在各个平台间分别编译(一处编写到处编译) |
|