记录Java7语言新特性

虽说做JAVA开发也有几年了,工作的原因所开发的系统都是在java6下开发的,最近看了下kotlin的语法,语法里有些确实让我眼前一亮的东西,在之前用java6开发中处理起来麻烦的在kotlin里有较好的解决,比如说空安全,方法、属性的覆盖,Lambda 表达式语法,if是表达式而在java里是语句,表达式就能带来表达式的好处,不胜枚举。因此让我对java6之后的版本新特性有了探一探的想法。

记录一下JavaSE7语言新特性:

官网参考地址:https://docs.oracle.com/javase/7/docs/technotes/guides/language/enhancements.html

整数类型的二进制表式

在JavaSE7的整数类型(byte,short,int和long),也可以使用二进制数字系统表示。要指定二进制字面值,数值添加前缀0b或0B。16进制的数值表示增加0x

例如:

// 一个8位的'byte'类型值:
byte aByte = (byte)0b00100001;

// 一个16位的'short'类型值:
short aShort = (short)0b1010000101000101;

// 一个32位的'int'类型值:
int anInt1 = 0b10100001010001011010000101000101;

// 一个64位的'long'类型值. 长整型以L结尾:
long aLong = 0b1010000101000101101000010100010110100001010001011010000101000101L;

数字字面值中加下划线

你可以使用下划线(_)使数字常量更易读,下面的示例显示有效的在数字字面值中加下划线:

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. 在数字的开头或结尾
  2. 与浮点数字中的小数点相邻
  3. F或L后缀之前
  4. 0x7fff中0_x7fff这样加是不可以的

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

推断泛型类型参数

只要编译器可以从上下文中推断出类型参数,你就可以用一对空着的尖括号<>来代替泛型参数。只有构造器的参数化类型在上下文中被显著的声明了,你才可以使用类型推断,否则不行。

例如:

Map<String, List<String>> myMap = new HashMap<>();
Map<String, List<String>> myMap = new HashMap();// 编译警告

try-with-resources语句

try-with-resources 是一个定义了一个或多个资源的try 声明.这个资源是程序处理完它之后需要关闭的对象。try-with-resources 确保每一个资源在处理完成后都会被关闭。 
任何实现了java.lang.AutoCloseable接口和java.io.Closeable接口的对象可以使用try-with-resources的资源。
java.io.InputStream, OutputStream, Reader, Writer, java.sql.Connection, Statement, and ResultSet这些类实现了AutoCloseable接口能够被用在try-with-resources语句中.

例如:

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

JAVA7之前关闭资源是在finally中,目的就是看开发有没有对申请使用的资源要关闭的意识。

捕获多个异常及增加类型检查后的重抛

在JavaSE7里,一个catch可以捕获多个异常,每个异常之间用 | 隔开。

......
catch (IOException|SQLException ex) {
    logger.log(ex);
throw ex;
}
JavaSE7可以更准确的分析出你抛出的异常类型,可以在throws上抛出更加具体的异常类型,这个在JavaSE7是不可以的。
public void rethrowException(String exceptionName) throws FirstException, SecondException {
	try {
		// ...
	} catch (Exception e) {
		throw e;
	}
}

猜你喜欢

转载自blog.csdn.net/aketoit/article/details/80201649