Java-7-的7个新特性_第1页
Java-7-的7个新特性_第2页
Java-7-的7个新特性_第3页
Java-7-的7个新特性_第4页
Java-7-的7个新特性_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java 7 的7个新特性1.对集合类的语言支持;2.自动资源管理;3.改进的通用实例创建类型推断;4.数字字面量下划线支持;5.switch中使用string;6.二进制字面量;7.简化可变参数方法调用。 1.对集合类的语言支持Java将包含对创建集合类的第一类语言支持。这意味着集合类的创建可以像Ruby和Perl那样了。原本需要怎样:1 List list = new ArrayList();2 list.add(item);3 String item = list.get(0);4 5 Set set = new HashSet();6 set.add(item);7 Map map = new HashMap();8 map.put(key, 1);9 int value = map.get(key); 现在只需这样:(这些集合是不可变的.)1 List list = item;2 String item = list0;3 4 Set set = item;5 6 Map map = key : 1;7 int value = mapkey; 2.自动资源管理Java中某些资源是需要手动关闭的,如InputStream,Writes,Sockets,Sql classes等。这个新的语言特性允许try语句本身申请更多的资源,这些资源作用于try代码块,并自动关闭。以前的写法:1 BufferedReader br = new BufferedReader(new FileReader(path);2 try 3 return br.readLine();4 finally 5 br.close();6 现在可以:(有点像C#)1 try (BufferedReader br = new BufferedReader(new FileReader(path) 2 return br.readLine();3 3.改进的通用实例创建类型推断;类型推断是一个特殊的烦恼,如下面的代码:1 MapString, List anagrams = new HashMapString, List(); 通过类型推断后变成:1 MapString, List anagrams = new HashMap();注:这个被叫做diamond(钻石)运算符,Java 7后这个运算符从引用的声明中推断类型。4.数字字面量下划线支持很长的数字可读性不好,在Java 7中可以使用下划线分隔长int以及long了。如:int one_million = 1_000_000;这样子还真看不惯。不过的确是可读性好了。 5.switch中使用string 这个问题是我在Java中不喜欢用switch的原因之一,以前在switch中只能使用number或enum。现在可以使用string了,哈哈,不错,赞个! 1 String s = . 2 switch(s) 3 case quux: 4 processQuux(s); 5 / fall-through 6 case foo: 7 case bar: 8 processFooOrBar(s); 9 break;10 case baz:11 processBaz(s);12 / fall-through13 default:14 processDefault(s);15 break;16 6.二进制字面量 由于继承C语言,Java代码在传统上迫使程序员只能使用十进制,八进制或十六进制来表示数(numbers)。由于很少的域是以bit导向的,这种限制可能导致错误。你现在可以使用0b前缀创建二进制字面量:1 int binary = 0b1001_1001; 现在,可以使用二进制字面量这种表示方式,并且使用非常简短的代码,可将二进制字符转换为数据类型,如在byte或short。1 byte aByte = (byte)0b001; 2 short aShort = (short)0b010; 7.简化可变参数方法调用。 当程序员试图使用一个不可具体化的可变参数并调用一个*varargs* (可变)方法时,编辑器会生成一个“非安全操作”的警告。JDK 7将警告从call转移到了方法声明(methord declaration)的过程中。这样API设计者就可以使用vararg,因为警告的数量大大减少了。Java 7 的新特性在switch语句中使用String在JDK 7 发布版本中,开发人员可以在switch表达是中,使用String对象:public String getTypeOfDayWithSwitchStatement(String dayOfWeekArg) String typeOfDay;switch (dayOfWeekArg) case Monday:typeOfDay = Start of work week;break;case Tuesday:case Wednesday:case Thursday:typeOfDay = Midweek;break;case Friday:typeOfDay = End of work week;break;case Saturday:case Sunday:typeOfDay = Weekend;break;default:throw new IllegalArgumentException(Invalid day of the week: + dayOfWeekArg);return typeOfDay;这次switch的增强,避免了遇到判断多个String对象时,使用多个if-else的表达式。try-with-resources语句try-with-resources语句是指在try语句中,描述了一个或多个资源资源的语句块,资源是指当程序结束后,必须关闭的资源对象。与try语句连用,确保接程序结束之前,每一个资源都被释放或关闭。任何实现了java.lang.AutoCloseable接口的可以作为一个资源使用。例如java.io.InputStream, OutputStream, Reader, Writer, java.sql.Connection, Statement, 和ResultSet,都实现了AutoCloseable接口,所有实现了这些接口的类都可以使用try-with-resources语句。考虑下面的例子,从文件中读取第一行。它会使用一个BufferReader的实例来从文件中读取数据。BufferReader是一个资源,当程序结束之前,必须确保被关闭,下面的例子中,不管try语句中,是否出现异常,使用finally语句块来确保BufferReader的实例被正常关闭。static String readFirstLineFromFile(String path) throws IOException BufferedReader br = new BufferedReader(new FileReader(path);try return br.readLine(); finally br.close();在使用JAVA SE 7后,可以使用下面的方式来完成同样的功能。static String readFirstLineFromFile(String path) throws IOException try(BufferedReader br = new BufferedReader(new FileReader(path)return br.readLine();我们在try-with-resources语句中,可以定义多个资源文件。下面的例子是一个拷贝文件的静态方法。这个例子展示了在先前Java SE版本中如何释放两个资源:static void copy(String src, String dest) throws IOException InputStream in = new FileInputStream(src);try OutputStream out = new FileOutputStream(dest);try byte buf = new byte8 * 1024;int n;while (n = in.read(buf) = 0)out.write(buf, 0, n); finally out.close(); finally in.close();下面的例子通过使用try-with-resources语句实现了同样的功能。The following example has the same functionality as the previous example, except it uses a try-with-resources statement:static void copy(String src, String dest) throws IOException try(InputStream in = new FileInputStream(src);OutputStream out = new FileOutputStream(dest)byte buf = new byte8192;int n;while (n = in.read(buf) = 0)out.write(buf, 0, n);在例子中,包含了两个资源,可以看出处理起来相当繁琐,需要嵌套的使用try语句才可以完成。下面再给出使用try-with-resources语句自动关闭java.sql.Statement对象的例子:public static void viewTable(Connection con) throws SQLException String query = select COF_NAME, SUP_ID, PRICE, SALES, TOTAL from COFFEES;try (Statement stmt = con.createStatement()ResultSet rs = stmt.executeQuery(query);while (rs.next() String coffeeName = rs.getString(COF_NAME);int supplierID = rs.getInt(SUP_ID);float price = rs.getFloat(PRICE);int sales = rs.getInt(SALES);int total = rs.getInt(TOTAL);System.out.println(coffeeName + , + supplierID + , + price +, + sales + , + total); catch (SQLException e) JDBCTutorialUtilities.printSQLException(e);泛型接口的使用看下面一个泛型变量的例子:MapString, List myMap = new HashMapString, List();在Java SE 7, 可以使用不带任何泛型参数的方式来构造一个泛型变量,例如:MapString, List myMap = new HashMap();再看一个错误使用的例子,下面的例子编译时会出错List list = new ArrayList();list.add(A);list.addAll(new ArrayList();原因是因为list 定义的泛型是String,addAll方法指能接受addAll ArrayList的实例。捕获多个异常类型,使用改进的类型检查重新抛出异常处理多个异常类型在 Java SE 第 7 和更高的版本,一个 catch 块可以处理多个类型的异常。此功能可以降低代码重复,并减少捕捉异常过于宽泛的缺陷。请考虑下面的示例中,在每一个catch块中,都包含了重复的代码:catch (IOException ex) logger.log(ex);throw ex;catch (SQLException ex) logger.log(ex);throw ex;在 Java SE 7 之前的版本,很难通过一个通用的方法消除重复的代码,因为变量前ex都有不同的异常类型。下面的示例中,在 Java SE 7 及更高版本中是可以使用的,可以消除重复的代码:catch (IOException|SQLException ex) logger.log(ex);throw ex;catch 子句指定了需要捕获的所有异常类型,每种异常类型之间用 (|)隔开。注: 如果 catch 块处理多个异常类型时,参会会被隐式的标记为final,在上面的例子中,ex 捕获参数是隐式的标记为final的,因此在catch块中,不能对ex重新赋值。编译可以处理多个异常类型的 catch 块,比编译许多catch块生成的字节码较小,而且性能更好,编译的字节码中,也不会有重复代码。用兼容性更强的类型检查重新抛出异常Java SE 7 编译器对于重新抛出异常的处理上,比早期版本的 Java SE有更精确的分析。这使您能够在throws代码块中,指定更加具体的异常类型。考虑下面的例子static class FirstException extends Exception static class SecondException extends Exception public void rethrowException(String exceptionName) throws Exception try if (exceptionName.equals(First) throw new FirstException(); else throw new SecondException(); catch (Exception e) throw e;此示例的 try 块可能抛出 FirstException 或 SecondException。假设您想要的 rethrowException 方法声明throw块中指定这些异常类型。在 Java SE 7 之前的版本,是不能这样做的。因为catch块的参数e,是Exception类型的,catch 块再次抛出的异常的参数 e、 只能通过在rethrowException 方法中指定throws块为Exception类型的异常。然而,在Java SE 7中,你可以在throws子句中,指定FirstException和SecondException的异常类型。Java SE 7编译器能判断出是最终抛出FirstException还是SecondException。即使异常参数e是Exception类型的:public void rethrowException(String exceptionName)throws FirstException, SecondException try / .catch (Exception e) throw e;在数字定义中使用下划线在 Java SE 第 7 和更高的版本,可以数字的任何位置可以使用任意个的下划线字符 (_)。,可以提高代码的可读性。例如,如果您的代码中包含很多位数的数字,你可以使用下划线分隔,类似于在句子中,使用都标点符号作为分隔符。下面的示例显示在数字中使用下划线的方法:long creditCardNumber = 1234_5678_9012_3456L;long socialSecurityNumber = 999_99_9999L;float pi = 3.14_15F;long hexBytes = 0xFF_EC_DE_5E;long hexWords = 0xCAFE_BABE;long maxLong = 0x7fff_ffff_ffff_ffffL;byte nybbles = 0b0010_0101;long bytes = 0b11010010_01101001_10010100_10010010;你只能将下划线放在数字之间的位置,你不能将下划线放在下面几个地方 在数字开发不能放 在小数点傍边不能使用下划线 不能放在F或L 后缀之前 本该是非数字字符的位置上不能使用下划线。下面是一些非法和合法的例子float pi1 = 3_.1415F; / Invalid; cannot put underscores adjacent to a decimal pointfloat pi2 = 3._1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论