`

Java7中那些新特性 - 1 (语法语义篇)

 
阅读更多
  Java7已经发布了很久了,Java8在明年也即将发布了,但对于Java7中的一些‘新’特性,一直没有系统的去学习过。日常工作中大多数的编程习惯还是基于Java6的,其实有一些重复且繁琐的工作再Java7中有更好的解决方案。最近开始阅读Java 7 New Features Cookbook一书。在此把读书笔记记录下来。

  Java7中新增加的特性包括:
  • 在switch语句中使用字符串
  • 可以在数字变量中使用下划线增强数字的可读性
  • try-with-resources代码块
  • 使用catch代码块捕获多个异常
  • 使用diamond operator改进泛型引用
  • 改进了方法中多可变参数的使用


下面我们逐个举例来了解一下各个新特性。

1 在switch语句中使用字符串可以大大简化以前的一些代码,避免了多个if else的出现。其实有趣的是,Java虚拟机并没有提供switch语句对string的支持,是Java编译器将String转换成了相应的byte code。

  使用string做switch语句条件时要注意两点:
 
  • Null对string的影响
  • 大小写的区分


  
public class StringSwitchExample {

    private static boolean verbose = false;
    private static boolean logging = false;
    private static boolean displayHelp = false;

    public static void main(String[] args) {

        for (String argument : args) {
            switch (argument) {
            case "-verbose":
            case "-v":
                verbose = true;
                break;
            case "-log":
                logging = true;
                break;
            case "-help":
                displayHelp = true;
                break;
            default:
            }
        }

        System.out.println("Illegal command line argument");
        displayApplicationSettings();
    }

    private static void displayApplicationSettings() {
        System.out.println("Application Settings");
        System.out.println("Verbose: " + verbose);
        System.out.println("Logging: " + logging);
        System.out.println("Help: " + displayHelp);
    }

}

 
  2 在Java7中数字变量的定义可以使用下划线(_)来增强可读性。对于那些与货币有关的系统,还是建议使用java.util.Currency更为合适。


public class UnderscoreSimple {

    public static void main(String[] args) {

        long debitCard = 1234_5678_9876_5432L;
        System.out.println("The card number is: " + debitCard);
        System.out.print("The formatted card number is:");
        printFormatted(debitCard);

        float minAmount = 5_000F;
        float currentAmount = 5_250F;
        float withdrawalAmount = 500F;

        if ((currentAmount - withdrawalAmount) < minAmount) {
            System.out.println("Minimum amount limit exceeded " + minAmount);
        }
    }

    private static void printFormatted(long cardNumber) {

        String formattedNumber = Long.toString(cardNumber);
        for (int i = 0; i < formattedNumber.length(); i++) {
            if (i % 4 == 0) {
                System.out.print(" ");
            }
            System.out.print(formattedNumber.charAt(i));
        }
        System.out.println();
    }
}


  3 Java7之前,我们需要对可关闭的资源做恰当的处理,通常是要在finally代码块中关闭需要被关闭的资源(java.io.InputStream或java.nio.Channel)。但在Java7中,如果一个类实现了java.lang.AutoCloseable接口,我们就可以通过try-with-resources代码块来自动关闭这些资源。

public class AutoCloseableExample {

    public static void main(String[] args) {

        String sourcePath = "file:///D:/home/docs/users.txt";
        String destPath = "file:///D:/home/docs/users.bak";
        Charset charset = Charset.defaultCharset();

        try (BufferedReader inputReader = Files.newBufferedReader(Paths.get(new URI(sourcePath)), charset);

        BufferedWriter outputWriter = Files.newBufferedWriter(Paths.get(new URI(destPath)), charset)) {

            String inputLine;

            while ((inputLine = inputReader.readLine()) != null) {
                outputWriter.write(inputLine);
                outputWriter.newLine();
            }

            System.out.println("Copy complete!");

        } catch (URISyntaxException | IOException ex) {
            ex.printStackTrace();
        }
    }
}


  4 使用Catching multiple exception types来避免冗长的异常捕捉。在Java7中我们可以用一个catch语句来捕获代码块中抛出的多个异常。

public class InvalidParameter extends java.lang.Exception {

    public InvalidParameter() {
        super("Invalid Parameter");
    }
}


public class MultipleExceptions {

    private static final Logger logger = Logger.getLogger("log.txt");

    public static void main(String[] args) {

        System.out.print("Enter a number: ");

        try (Scanner scanner = new Scanner(System.in)) {

            int number = scanner.nextInt();
            if (number < 0) {
                throw new InvalidParameter();
            }
            System.out.println("The number is: " + number);
        } catch (InputMismatchException | InvalidParameter e) {
            logger.log(Level.INFO, "Invalid input, try again");
        }

    }
}


  5 使用diamond operator简化了对泛型对象的创建。

 
List<String> list = new ArrayList<>();

List<Map<String, List<String>> stringList = new ArrayList<>();


  6 @SafeVarargs和@SuppressWarnings这两种注解是用来处理那些通常无害的警告信息的。顾名思义@SuppressWarnings是用来消除那些特殊类型的警告的。Java7中引进的@SafeVarargs注解是用来指定一些方法或构造方法是安全的,这些方法或构造方法使用了不定长参数。如果传递的不定长参数是泛型的,我们可以给方法加上@SafeVarargs来消除无害的警告。

public class SafeVargExample {

    @SafeVarargs
    public static <T> void displayElements(T... array) {
        for (T element : array) {
            System.out.println(element.getClass().getName() + ": " + element);
        }
    }

    public static void main(String[] args) {

        ArrayList<Integer> a1 = new ArrayList<>();
        a1.add(new Integer(1));
        a1.add(2);
        
        ArrayList<Float> a2 = new ArrayList<>();
        a2.add(new Float(3.0));
        a2.add(new Float(4.0));
        
        displayElements(a1, a2, 12);
    }

}
分享到:
评论

相关推荐

    基于java的词法分析器-支持LL(1)语法分析、LR(1)语法分析.zip

    基于java的词法分析器-支持LL(1)语法分析、LR(1)语法分析 基于Java的词法分析器是一个复杂的编程项目,它不仅涉及到词法分析,还包括对LL(1)和LR(1)语法分析的支持。这样的项目可以帮助开发者深入理解编译原理中的...

    Java编写的一个类C语言编译器(词法分析,语法分析,语义分析和目标代码生成).zip

    Java编写的一个类C语言编译器(词法分析,语法分析,语义分析和目标代码生成) 编写一个完整的类C语言编译器是一个复杂的编程项目,涉及多个阶段,包括词法分析、语法分析、语义分析和目标代码生成。以下是一个简化...

    简单的语法、词法、语义分析器.zip

    - 从一个简单的编程语言子集开始,逐步增加支持的语法和语义特性。 - 使用单元测试和集成测试来验证分析器的正确性。 - 编写详细的文档,记录设计决策、实现细节和测试结果。 - 考虑使用版本控制系统(如Git)来管理...

    基于Java实现的简单的词法分析器和语法分析器.zip

    - 从一个简单的语言子集开始,逐步增加支持的语法和语义特性。 - 使用单元测试来验证分析器的正确性。 - 编写详细的文档,记录设计决策和实现细节,便于项目维护和他人理解。 通过实现这样一个编译器前端,学生可以...

    Java语言规范

    , 详细讲述Java SE 8的语法、语义和结构。, 彻底覆盖Java SE 8的主要改进,包括lambda表达式、方法引用、缺省方法等。, 充分解决如何提升JAVA语言中最流行的特性之一——注解的效用。, 包含宝贵的见解,区分JAVA的...

    Java编程规范(第三版)pdf

    本书试图详细说明Java语言的语法和语义规范。编者试图在每一种语言结构的行为,以便让所有实现都接受同一个程序。除了时间相关性或无法确定因素之外,如果有足够的时间和足够的内存空间,用Java编程语言所写的程序...

    JAVA编程规范

    , 本书试图详细说明Java语言的语法和语义规范。编者试图在每一种语言结构的行为,以便让所有实现都接受同一个程序。除了时间相关性或无法确定因素之外,如果有足够的时间和足够的内存空间,用Java编程语言所写的程序...

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    走近Java 第1章 走近Java / 2 1.1 概述 / 2 1.2 Java技术体系 / 3 1.3 Java发展史 / 5 1.4 展望Java技术的未来 / 9 1.4.1 模块化 / 9 1.4.2 混合语言 / 9 1.4.3 多核并行 / 11 1.4.4 进一步丰富语法 ...

    java编程规范

    , 本书试图详细说明Java语言的语法和语义规范。编者试图在每一种语言结构的行为,以便让所有实现都接受同一个程序。除了时间相关性或无法确定因素之外,如果有足够的时间和足够的内存空间,用Java编程语言所写的程序...

    Java2核心技术.part1

    Java2核心技术第I卷.基础知识 目录: 译者序 前言 第1章Java程序设计概述 1.1 Java程序设计平台 1.2 Java“白皮书”的关键术语 1.2.1简单性 1.2.2面向对象 1.2. 3分布式 1. 2.4健壮性 1. 2.5安仝性 1. 2.6...

    Java2核心技术.part5

    Java2核心技术第I卷.基础知识 目录: 译者序 前言 第1章Java程序设计概述 1.1 Java程序设计平台 1.2 Java“白皮书”的关键术语 1.2.1简单性 1.2.2面向对象 1.2. 3分布式 1. 2.4健壮性 1. 2.5安仝...

    《Java程序设计案例教程》课程标准.doc

    2.2知识目标 理解和掌握Java的基本语法和语义,掌握Java语言基础知识,初步掌握Java面向对象 编程的基本思想。 2.3素质目标 训练学生树立面向对象的编程思想、提高代码编写的熟练度和规范度,并开始接触企 业的应用...

    java8rt.jar源码-WALA-improve:学习WALA和静态代码分析。本项目介绍所需知识和学习路线图

    java8 rt.jar源码 WALA-improve 学习wala和静态代码分析,以及涉及到的一些概念。 Study WALA and static code analysis . This project introduces the required knowledge and study roadmap. 数据流分析技术 (Data...

    SNMP网管系统中MIB编译的实现与应用-文档

    语法分析、语义分析、语法树生成、MIB树生成和Java目标代码生成进行了详细的分析和设计,实现了词法分析模块和语法分析模块,并通过一些功能测试验证了MIB编译器的可行性;对基于MIB编译的SNMP网管系统进行了系统...

    Java2核心技术.part3

    Java2核心技术第I卷.基础知识 目录: 译者序 前言 第1章Java程序设计概述 1.1 Java程序设计平台 1.2 Java“白皮书”的关键术语 1.2.1简单性 1.2.2面向对象 1.2. 3分布式 1. 2.4健壮性 1. 2.5安仝...

    Java2核心技术.part6

    Java2核心技术第I卷.基础知识 目录: 译者序 前言 第1章Java程序设计概述 1.1 Java程序设计平台 1.2 Java“白皮书”的关键术语 1.2.1简单性 1.2.2面向对象 1.2. 3分布式 1. 2.4健壮性 1. 2.5安仝...

    Java2核心技术.part4

    Java2核心技术第I卷.基础知识 目录: 译者序 前言 第1章Java程序设计概述 1.1 Java程序设计平台 1.2 Java“白皮书”的关键术语 1.2.1简单性 1.2.2面向对象 1.2. 3分布式 1. 2.4健壮性 1. 2.5安仝...

    Java2核心技术.part2

    Java2核心技术第I卷.基础知识 目录: 译者序 前言 第1章Java程序设计概述 1.1 Java程序设计平台 1.2 Java“白皮书”的关键术语 1.2.1简单性 1.2.2面向对象 1.2. 3分布式 1. 2.4健壮性 1. 2.5安仝...

Global site tag (gtag.js) - Google Analytics