Java7新语言特性

标签: Java | 发表时间:2011-09-23 13:08 | 作者:(author unknown) zffl
出处:http://hzqtcblog.appspot.com/

Java7发布有一段时间了,这几天升级了一下JDK,结果发现Eclipse3.7还没有支持JDK7。这个需要稍微解释一下,可能有人不知道,Eclipse使用自己的Java编译器而不是JDK自带的javac。Eclipse自己的编译器就是ecj(Eclipse Compiler for Java),一般的Linux发行版都有eclipse-ecj这样的包。ecj其实也是用Java实现的,编译出来的class文件比javac小一点,按照使用Eclipse的经验来看,ecj编译速度也比javac快一些。PS:最新的Eclipse开发版已经支持JDK7了。

虽然闭包、python样式的集合和null安全语法这些非常酷的特性被延期到了Java8,Java7中还是有其他一些很不错的新语言特性。首先是两个数值表述语法上的改进:支持以0b开头的二进制数值(Binary Literals);和支持在数值中包含下划线(Underscores in Numeric Literals)。

class Main { public static void main(String[] args) { int a = 157; int b = 0b1001_1101; int x = 0x9d; System.out.println(a == b); System.out.println(a == x); } }

Switch语句支持字符串(Strings in switch Statements):

class Main { public static void main(String[] args) { switch(args[0]) { case "start": System.out.println("Started!"); break; case "stop": System.out.println("Stopped!"); break; } } }

自动推断泛型参数(Type Inference for Generic Instance Creation)。下面的例子中,第一条语句是JDK7之前的规范而冗长的语法,第二条是JDK7新增的自动类型推断语法,第三条无论是JDK7还是之前的版本都会给出一个warning。

Map<String, List<String>> myMap = new HashMap<String, List<String>>(); Map<String, List<String>> myMap = new HashMap<>(); Map<String, List<String>> myMap = new HashMap();

对于try...catch结构有两个改进,第一个是支持单语句捕获多个类型的异常(Catching Multiple Exception Types)。下面的例子中,第一段代码是JDK7之前冗长的catch列表;第二段代码是JDK7新语言特性带来的清爽。

class GoodException extends Exception {} class BadException extends Exception {} class Main { public static void main(String[] args) { try { if(args.length == 0) throw new GoodException(); else throw new BadException(); } catch(GoodException e) { e.printStackTrace(); } catch(BadException e) { e.printStackTrace(); } } }
class GoodException extends Exception {} class BadException extends Exception {} class Main { public static void main(String[] args) { try { if(args.length == 0) throw new GoodException(); else throw new BadException(); } catch(GoodException | BadException e) { e.printStackTrace(); } } }

第二个对于try...catch结构的改进是类似C#的using语句(The try-with-resources Statement),在try语句中打开的资源会自动释放,无论是正常退出还是异常退出。这要求打开的资源必须实现AutoClosable接口或者Closable接口。JDK7里的IO类都实现了AutoClosable接口。同样给出两段代码以作比较:

import java.io.*; class Main { public static void main(String[] args) throws IOException { String data = "hello"; ByteArrayOutputStream out = null; try { out = new ByteArrayOutputStream(); out.write(data.getBytes()); System.out.println(new String(out.toByteArray())); } catch(IOException e) { e.printStackTrace(); } finally { if(out != null) out.close(); } } }
import java.io.*; class Main { public static void main(String[] args) { String data = "hello"; try(ByteArrayOutputStream out = new ByteArrayOutputStream()) { out.write(data.getBytes()); System.out.println(new String(out.toByteArray())); } catch(IOException e) { e.printStackTrace(); } } }

这几个新特性大部分还是很有用的,尤其是对try...catch结构的改进。由于Java的严谨性,try...catch可谓无处不在,本来很短的代码,套上try...catch之后就变得很长,有了这两项对症下药的改进,可以大大缩减代码量。

相关 [java7 语言] 推荐:

Java7新语言特性

- zffl - Import
Java7发布有一段时间了,这几天升级了一下JDK,结果发现Eclipse3.7还没有支持JDK7. 这个需要稍微解释一下,可能有人不知道,Eclipse使用自己的Java编译器而不是JDK自带的javac. Eclipse自己的编译器就是ecj(Eclipse Compiler for Java),一般的Linux发行版都有eclipse-ecj这样的包.

Java7 java.util.concurrent 并发包计划

- - 并发编程网 - ifeve.com
原文链接, 译文链接,译者:DOM,校对:郑旭东.  Java7发布版本的具体计划应该开始了,之前经常有人问我们关于JSR166的后续计划包含哪些内容. 下面是目前暂定的内容,欢迎提出你们的见.    一个通用的内存屏障实现.   一个具有非阻塞,阻塞和同步接口的队列.   并发Hash Map,其键和值可以是弱引用或者软引用.

笔者带你剖析Java7.x新特性

- -
最近在ITeye上看见一些朋友正在 激烈讨论关于Java7.x的一些语法结构,所以笔者有些手痒,特此 探寻了7.x(此篇博文笔者使用的是目前最新版本的JDK-7u15)的一些 新特性分享给大家. 虽然目前很多开发人员至今还在沿用Java4.x(笔者项目至今沿用4.x),但这并不是成为不前进的 借口.

语言壁垒

- kylexlau - Chun Tian (binghe)
虽然经常更新微博,但确实又有些日子没写常规博客了. 10 月开始前有必要再写一篇,整理一下近期的各种思路,以良好的精神面貌迎接今年的最后一个季度. 首先发布一个已经不太新的消息:Practical Common Lisp 的中文版《实用 Common Lisp 编程》几经周折终于付印了,下月即可正式出版;读者们甚至已经可以在当当网上预订了.

UnQL:NoSQL查询语言

- 卡飞菲 - Solidot
CouchDB作者Damien Katz与SQLite作者Richard Hipp正在为NoSQL文档数据库开发一种高级查询语言UnQL(发音同Uncle,是UNstructured Query Language的缩写). Katz表示,他们坚信为了推广NoSQL需要一种通用的查询语言,类似当年推广关系型数据库应运而生的SQL语言.

Go 语言初步

- wei - 云风的 BLOG
所谓认真玩,就是拿 Go 写点程序,前后大约两千行吧. 据说 Go 的最佳开发平台是 Mac OS ,我没有. Windows 版还没全部搞定,但是也可以用了. 如果你用 google 搜索,很容易去到一个叫 go-windows 的开源项目上. 如果你用这个,很多库都没有,而且语法也是老的. 我在 Windows 下甚至不能正确链接自己写的多个 package.

C语言之父

- Dylen - 子说
同事说c语言之父去世了,另一个同事大吃一惊,问:谭浩强死了. 不知丹尼斯·里奇(Dennis Ritchie)情何以堪.

如何学好C语言

- 夕角 - 酷壳 - CoolShell.cn
有人在酷壳的留言版上询问下面的问题. 我也遇到了和提问的老外一样的问题. 能给像遇到这样烦恼的程序员一点建议嘛. 我相信,这可能是很多朋友的问题,我以前也有这样的感觉,编程编到一定的时候,发现能力到了瓶颈,既不深,也不扎实,半吊子. 比如:你长期地使用Java和.NET ,这些有虚拟机的语言对于开发便利是便利,但是对于程序员来说可能并不太好,原因有两个:.

笨办法学C语言

- Hexi - Solidot
继《笨办法学Python》之后,Zed Shaw开始动手写《笨办法学C语言》. 和《笨办法学Python》一样,这本C语言入门书也将采用习题方式引导读者学习. 在序言中,他引用了笛卡尔《第一哲学沉思录》中的一段话去描述C语言:“直到现在,凡是我当作最真实、最可靠而接受过来的东西,我都是从感官或通过感官得来的.

C语言编译器 Cilk

- Le - 开源中国社区最新软件
Cilk多线程编程技术最早由MIT开 发,是一个基于Gcc编译器的开源项目. 后来开发者创建了一个创业公司,推出改进的私有版本,整合到Windows下的多种编译器中. 之后它被英特尔公司 收购,整合进英特尔的编译器中. 现在,它再次成为一个开源项目,成为Gcc 4.7下的一个分支. Cilk Plus允许C和C++程序员能高效利用多核处理器的并行处理能力.