版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、java语言基础特性一第一部分(上)-编程开发技术java语言基础特性一第一部分(上)木文由importnew陈晓舜翻译自javaworldo欢迎加入翻译小组。转载请见文末要求。用断言和泛型进行java编程从jdk1. 4到即将到来的java 8的lambdas, java语言比一开始的 时候已经进步了很多了。在“java 101: java的新时代”的接下 來的儿篇文章中会描述java语言的一系列基木特性工具,这个星 期就先从断言(assertions)和泛形(generics)开始。java语言是世界上最广泛使用的编程语言之一,因此,我们不难想像,一些对 它的改变有时会备受争议。在“jqv
2、ei 101, java的新时代”的接下来的几篇文章 会集屮在那些从java 1. 4到java 8屮添加的特性。我们的目的是介绍给你一系 列的java语言特性的工具,当然会附带一些例子说明他们怎么在java程序中使 用,并且为什么要那样用。我们也会探索其他的一些有争议的新特性,例如泛型 和1 ambda (查看文章底部的我关于泛型擦除的讨论)。第一篇文章中我们来谈谈断言(assertions),它是在java 14的时候就引入 的,另外述冇泛型(generics),它是java 5引入的少数重要的新特性之一。java 1.4 中的断言(assertions)断言(assertions)是在j
3、ava 1. 4引入的,到现在仍然是java语言最冇用并且 最重要的附加功能z-o断言(assertions)主耍用于在程序中判断结杲是否正 确。断言(assertions)测试条件是否是true值(又叫布尔表达示),当条件 为false时通知开发人员。使用断言可以在代码的正确性上极大地提升你的信 心。java常见问答博客你有关于java编程的问题吗?可以从有经验的java导师屮获取可 靠的答案。jeff friesen的java常见问答博客每个星期都会更新, 会集中在一些java初学者和稍有经验的开发人员遇到的常见问 题。假设你已经启用它们用于程序测试,断言是一些可以在运行时执行的可编译的实
4、 体。你可以在bugs发生的地方设置断言,在出现问题的时候它就会告诉你,这 可以极大地减少你调试冇问题的程序的时间。在java 1. 4之前,开发人员大部分都是使用注释来进行一些代码正确性的假设。 虽然对代码进行文档注释很有用,但注释比起断言是稍逊一筹的,毕竞断言是测 试和调试的机制。因为编译器忽略注释,没有办法用它们来实现bug的通知。在 代码修改时,注释并没有修改的问题也是很常见的。实现断言断言是通过assert表达式和java. lang. assertionerror类来实现的。这个表达 式以关键字assert开头,后跟着一个布尔表达式。assert表达式语法上表示如 下:assert
5、 boolcanexpr;如果booleanexpr为true,什么事都不会发生,执行会继续。但是,如果表达 式为false, assertionerror会初始化并被抛出,如清单1所示。listing 1. assertdemo. java (version 1)public class asscrtdcmopublic static void main(string args)int x 二 t;assert x >= 0;在listing 1中的断言表明开发人员希望变量x包含一个大于等于0的值。然而, 这显然是不正确的,这个断言表达式执行后会抛出assertionerror。编译清
6、单 1 ( javac assertdemo. java),开启断言并执行(java -ea assertdemo)。 你应该可以看到卜'面的输出:exception in thread "main” java. lang. assertionerror at assertdemo. main(assertdemo. java:6)对于另外一种例子,不带-ea (enable assertions)参数执行assertdemo将会 没有任何输出。当断言没有启用时,尽管它们仍然存在classfilc中,但它们并 不会被执行。使用断言来测试前置条件(preconditions)和
7、后置条件(postconditions)断言经常用于测试一个程序的前置条件和后置条件:询置条件是在执行一些代码流程询必须为true的条件。丽置条件保证调用方法和被 调用方法保持一致的协议。后置条件是在执行一些代码流程后必须为true的条件。后置条件保证被调用方法和 调用方法保持一致的协议。前置条件你可以在需要的时候通过显示的检查和抛岀异常限制在public构造函数和方法 中执行前置条件。对于一些私有的帮助方法,你可以通过指定断言來执行前置条 件。listing 3. assertdemo. java (version 3)import java. io.filelnputstream; imp
8、ort java. io. inputstream; import java. io. toexception;class png/* create a png instance, read specified png fi1e, and decode* it into suitable structures.* ©param filespec path and name of png file to read* throws nulipointerexception when code>filespec/code> is* <code>null</co
9、de>*/png(string filespec) throws ioexception/ enforcc prcconditions in non-privatc construetors emd / methods.if (filespec 二二 null)throw new nullpointerexception( “filespec is null” );try (filelnputstream fis = new fi1elnputstream(filespec)readheader(fi s);private void readheader(inputstream is)
10、throws ioexception / confirm that precondition is satisfied in private/ helper methodsassert is !二 null : "null passed to is"public class assertdemopubl ic static void main(string args) throws toexception png png = new png (args, length = 0) ? null : args0);清单3中的是一个最小的读取和解码png (portable ne
11、twork graphics)图片 文件的png类。构造函数明确地把filespec和null进行对比,当这个参数包含 null时抛出nullpointcrexccptiono这里最主要的口的是执行前置条件保证 filespec 不包含 null。指定assert filespec != null并不大好;因为当断言被关闭时,构造函数的 javadoc 提到的前置条件并不被推荐。(实际上,述是可以接受的,因为 fi letnputstreamo会抛出nul ipointerexception,但你不应该依赖这些没冇强 制文档的行为。)然而,assert在private readheader (
12、)帮助方法屮是合适的,它会完全读取和 解码png文件的8位头。传递一个非空值的前置条件会一直是通过的。后置条件后置条件通常是通过断言來指定的。不管方法(构造函数)是否是public。请 看清单4listing 4. assertdemo. java (version 4)public class assertdemopublic static void main(string args)int array = 20, 91, -6, 16, 0, 7, 51, 42, 3, 1 ; sort (array);for (int element: array)system, out. printf
13、( "%d element);system, out. println();private static boolean issorted(int x)for (int i 二 0; i < x. lengtht ; i+)if (xi > xi+l) return false;return true;private static void sort (int x)int j, a;/ for all integer values except the leftmost value for (int i 二 1; i < x.length; i+)/ get int
14、eger value a.a = xi;/ get index of a. this is the initial insert position, which is/ used if a is larger than all values in the sorted section. j = 1;/ while values exist to the left of a,s insert position and the/ value immediately to the 1 eft of that insert position is / numerically greater them
15、a" s value while (j > 0 && xj-l > a)/ shift left value一xj-1one position to its right/ xj xj = xj-l;/ update insert position to shifted value" s originalposition/ (one position to the left). j;/ insert a at insert position (which is either the initial insert/ position or the f
16、ineil insert position), where a is greater than/ or equal to all values to its left.xj二 a;assert issorted(x) : “array not sorted;清单4展示了使用插入排序算法來排序int值数组的sort帮助方法。我在sorto 返回前使用了 assert来检查x被排序的后置条件。清单4的例子展示了断言的一个重要特点,就是它们执行的时候代价比较高。因 此,断言在生产代码中一般是禁用的。在清单4中,issorted()必须搜索整个数 组,当数组非常大吋,这将会非常耗吋。java 5的泛型
17、除了 java并发工具(2013年6丿j修订)夕卜,java 5添加了 8个语言特性:泛型, 类型安全枚举,注解,口动装箱和拆箱,增强的循环,静态导入,可变参数和协 变返回类型。我会在接下来的两篇文章中介绍所有java 5的特性,我们先从泛 型开始。泛型是一系列的语言特性,它允许类型或方法能在获取编译时类型安全的同时操 作不同类型的对象。泛型针对的是运行过程屮由于代码非类型安全抛出 java. lang. classcastexceptions 异常的问题。java类库的泛型尽管泛型在java collection framework小广泛使用,但他们并不 专有。其他的java基础类库包括ja
18、va. lang. class, java.lang.comparable, java.lang.threadlocal 和 java. lang. ref. weakreference 也有使用它。考虑下面的代码块,它展示了泛型引入前在j&眩代码中很常见的类型安全问题: list doublelist = new linkedlist(); doublelist add(new double(3. 5);double d 二(double) doublelist, iterator().next();尽管上面程序的目的只是为了保存java. lang. double对象到list,但
19、没有任何 东西可以阻止保存其他类型的对彖。例如,你可以指定doublelist, add ("hello");来添加一个 java. lang. string 对象。然而,当保存 其他类型的对象时,最后一行(double)的转换操作会在遇到一个非double的 对象吋抛出 classcastexceptiono因为这种类型安全的问题直到运行才会被检测出來,开发人员可能发现不了问 题,而遗留到了客户那里。很显然,由编译器来检测问题是更好的。泛型帮助编 译器,使z可以让开发人员标记list需要包含哪种特定类型的对象,如下:list<double> doublelist 二 new linkedlist<double>();doublelist. add(new double(3. 5);double d = doublclistitcrator()next();list<double>现在读做double类型的listolist是一个泛型接口,表示为list, 当在操作具体的对象时接收一
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 产品助理面试题及竞品分析方法含答案
- 财务管理招聘全解析及答案集
- 软件测试工程师的成长路径与技能提升
- 市场专员面试要点及题目参考
- 税务客服专员培训题库与答案参考
- 刀具存储项目可行性分析报告范文(总投资12000万元)
- 深度解析(2026)《GBT 18793-2002信息技术 可扩展置标语言(XML)1.0》
- 深度解析(2026)《GBT 18737.4-2003纺织机械与附件 经轴 第4部分织轴、整经轴和分段整经轴边盘的质量等级》
- 针对BIM技术的负责人面试题集
- 中航工业安全工程师笔试题库及解析
- 切尔诺贝利核电站事故工程伦理分析
- 初中地理七年级上册第七章第四节俄罗斯
- 法院起诉收款账户确认书范本
- 课堂观察与评价的基本方法课件
- 私募基金内部人员交易管理制度模版
- 针对低层次学生的高考英语复习提分有效策略 高三英语复习备考讲座
- (完整)《走遍德国》配套练习答案
- 考研准考证模板word
- 周练习15- 牛津译林版八年级英语上册
- 电力电缆基础知识课件
- 代理记账申请表
评论
0/150
提交评论