论坛首页 Java企业应用论坛

Java7带来的新的语言特性

浏览 12298 次
精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2011-07-08   最后修改:2011-07-08

Java7的正式版在本月的28号就要发布了,拥抱Java7,看一看Java7能带来哪些语言特性呢?

 

英文原文:http://download.java.net/jdk7/docs/technotes/guides/language/enhancements.html

简单的翻译了一下,有些地方翻译的不妥,欢迎大家批评指正。

 

1。二进制字面量值

// An 8-bit 'byte' value:

	byte aByte = (byte)0b00100001;

	// A 16-bit 'short' value:
	short aShort = (short)0b1010000101000101;

	// Some 32-bit 'int' values:
	int anInt1 = 0b10100001010001011010000101000101;
	int anInt2 = 0b101;
	int anInt3 = 0B101; // The B can be upper or lower case.

	// A 64-bit 'long' value. Note the "L" suffix:
	long aLong = 0b1010000101000101101000010100010110100001010001011010000101000101L;
 

2.可以在数字字面量中使用"下划线"("_")

 

 

        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;
 

 

要注意的是,下划线放在以下几个地方是不正确的:

(1).最前面; 如_52 ,这不是数字字面量,而是也是变量名了

(2).小数点的两边; 如float pi1 = 3_.1415F 和 float pi1 = 3._1415F 都是不正确的

(3).最后面; 如int x3 = 52_;

(4).不能放在0x这样前缀的中间,如:int x5 = 0_x52;

3.可以在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;
	}
 

4.类型推断,泛型构造器和非泛型的Classes

(Type Inference and Generic Constructors of Generic and Non-Generic Classes)

首先看一个泛型构造器和类型推断的例子:

class MyClass<X> {  
	  <T> MyClass(T t) {
	    // ...
	  }
	}
 

 

这里X是泛型类MyClass<X>的参数化类型,而T是其构造器的参数化类型。

那怎么样实例化它呢?

new MyClass<Integer>(""),这条语句创建了MyClass<Integer>一个实例,这条语句显式的指定了MyClass<X> 中的参数X的类型为Integer。 同时,因为实际调用构造器时参数是String类型,所以编译器推断String就是这 个T的类型,。

接下来看下面这两种例子:

1.MyClass<Integer> myObject = new MyClass<>("");

 在这里例子中,编译器推断Integer为泛型类MyClass<X>正式参数化类型X的类型,推断String为该泛型类构造器的正式参数化类型T的实际类型。

2.MyClass<Integer> myObject = new <String> MyClass<>("");

 在这里例子中,编译器推断Integer为泛型类MyClass<X>真是参数化类型X的类型,同时这条语句显式的指定了构造器的正式参数化类型T的实际类型。

 

5. Improved Compiler Warnings and Errors When Using Non-Reifiable Formal Parameters with Varargs Methods不知道怎么翻译。 “当在可变长参数方法中使用不可具体化的参数时改良的警告和错误”,行么?

6.带有资源的try语句  

The try-with-resources Statement  

一个带有资源的try语句就是一个声明了一个或者多个资源的try语句,资源是指当程序结束后必须关闭的对象。带有资源的try语句保证在语句结束的时候每个资源都会被关闭(调用其close()方法)。任何实现了java.lang.AutoCloseable 或者 java.io.Closeable接口的对象都可以被用作为一个资源。

 

下面这个例子的作用是从一个文件中读取第一行。使用了一个BufferedReader从文件中读取数据,在这里BufferedReader就是一个在程序结束后必须关闭的资源。

static String readFirstLineFromFile(String path) throws IOException {
	  try (BufferedReader br = new BufferedReader(new FileReader(path))) {
	    return br.readLine();
	  }
	}
 

 

上面说到可以在try语句中声明一个或多个资源,下面就是一个声明了多个资源的try语句,它的功能是获得打包在zip文件中的所有文件的文件名,然后把这些文件名保存到一个txt文件中。

 

public static void writeToFileZipFileContents(String zipFileName, String outputFileName)
	    throws java.io.IOException {

	    java.nio.charset.Charset charset = java.nio.charset.Charset.forName("US-ASCII");
	    java.nio.file.Path outputFilePath = java.nio.file.Paths.get(outputFileName);

	    // Open zip file and create output file with try-with-resources statement

	    try (
	      java.util.zip.ZipFile zf = new java.util.zip.ZipFile(zipFileName);
	      java.io.BufferedWriter writer = java.nio.file.Files.newBufferedWriter(outputFilePath, charset)
	    ) {

	      // Enumerate each entry

	      for (java.util.Enumeration entries = zf.entries(); entries.hasMoreElements();) {

		// Get the entry name and write it to the output file

		String newLine = System.getProperty("line.separator");
		String zipEntryName = ((java.util.zip.ZipEntry)entries.nextElement()).getName() + newLine;
		writer.write(zipEntryName, 0, zipEntryName.length());
	      }
	    }
	  }
 

 

 大家需要知道的是,一个带有资源的try语句和普通的try语句一样可以有catch和finally语句块,但是任何catch或者finally块都是在所有的资源关闭后才执行的。

7.捕捉复合(Multiple)异常类型以及使用改良的类型检查重掷(Rethrowing)异常

在Java6以及以前版本一般我们这样捕获多个类型的异常:

catch (IOException ex) {
	     logger.log(ex);
	     throw ex;
	catch (SQLException ex) {
	     logger.log(ex);
	     throw ex;
	}
 

 

在Java7里可以这么干:

catch (IOException|SQLException ex) {
	    logger.log(ex);
	    throw ex;
	}
 

 

下面看一个抛出异常的例子:

JDK6及以前版本:

 

 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;
	    }
	  }
 

 

 JDK7:

  public void rethrowException(String exceptionName)
	  throws FirstException, SecondException {
	    try {
	      // ...
	    }
	    catch (Exception e) {
	      throw e;
	    }
	  }
 

 

   发表时间:2011-07-09  
倒是没觉得有什么太多的更新,
0 请登录后投票
   发表时间:2011-07-09  
不止这一些吧,如果还这样,java就真的很难混了
0 请登录后投票
   发表时间:2011-07-09  
6.带有资源的try语句 
自动关闭资源很好哦
0 请登录后投票
   发表时间:2011-07-09  
wenjinglian 写道
6.带有资源的try语句 
自动关闭资源很好哦

0 请登录后投票
   发表时间:2011-07-09   最后修改:2011-07-09
都是些语法糖

语法糖吃多了 不利于提高代码质量

java应该在类库的丰富性和代码执行效率上下功夫

而不是搞这种可以节省1%敲代码时间的语法糖
0 请登录后投票
   发表时间:2011-07-09  
还好,没有太大的变化。
最值得赞赏的就是,没有赶时髦引入闭包和lambda表达式
0 请登录后投票
   发表时间:2011-07-09  
groovyzhou 写道
还好,没有太大的变化。
最值得赞赏的就是,没有赶时髦引入闭包和lambda表达式

我记得是有闭包的,而且为了闭包才推迟到今年发布
0 请登录后投票
   发表时间:2011-07-09  
yuyue007 写道
不止这一些吧,如果还这样,java就真的很难混了


这些只是一些语法上的更新。
更多的JAVA7的特性参见http://openjdk.java.net/projects/jdk7/features/
0 请登录后投票
   发表时间:2011-07-09  
都玩C++算了
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics