`

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版)

    语义分析是编译器设计中的关键步骤,它在词法分析和语法分析之后进行,目的是检查源程序的语义是否正确,并将其转化为计算机可理解的形式。在这个“语义分析实验(Java版)”中,我们将重点探讨如何利用Java语言实现...

    语法分析器java实现

    语法分析器通常分为LL(1)、LR(0)、LALR(1)、LL(*)等不同类型,选择哪种类型取决于你所设计的语言特性和复杂度。 **编译原理**: 编译原理是计算机科学的一个分支,它研究如何将高级编程语言转化为机器可执行的代码...

    基于java实现的语法分析器及词法分析器

    在这个项目中,我们关注的是一个基于Java实现的语法分析器和词法分析器。Java是一种广泛使用的编程语言,具有跨平台、面向对象和丰富的类库等特性,使得它成为构建这种复杂工具的理想选择。 首先,让我们深入了解...

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

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

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

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

    java版语法分析程序

    Java版的语法分析程序是计算机科学领域中编译器设计的一部分,主要负责将源代码转换成解析树(或称为抽象语法树,AST - Abstract Syntax Tree)的结构,这是编译器理解并处理程序语句的基础。这个过程通常分为词法...

    java模拟编译器,实现词法,语法分析,生成语法树

    在Java模拟编译器中,开发者会利用这个树状结构来检查代码的语义,执行类型检查,并为后续的代码生成做准备。 除了词法分析和语法分析,编译器还可能包含语义分析阶段,这是对代码意义的理解,包括类型检查、作用域...

    编译原理语义分析java实现

    在Java中实现语义分析,我们可以利用抽象语法树(AST)这一数据结构。AST是源代码的结构化表示,其中每个节点代表一个语法构造。通过遍历AST,我们可以进行语义检查和类型推断。例如,对于表达式"3 + 'a'",在语法...

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

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

    Java9解析器和抽象语法树

    总之,Java 9的解析器和抽象语法树是其核心编译过程的关键部分,它们在处理新语言特性、优化性能、提供更好的错误反馈等方面都有所提升。JavaParser库则为开发者提供了强大工具,以交互式和程序化的方式处理和理解...

    Java语言规范 SE 7 版本-带书签文字版.zip

    这份规范详细定义了Java语言的语法、语义以及程序执行模型,是Java程序员理解和掌握Java语言的基础。 在Java SE 7版本中,主要包含以下关键知识点: 1. **基础语法**:Java语言规范详细阐述了包括变量声明、数据...

    传智播客_Java培训_毕向东_Java基础[02-Java基础语法1]

    ### 传智播客_Java培训_毕向东_Java基础[02-Java基础语法1] 本章节将围绕“Java基础语法”展开讲解,主要内容包括Java语言中的关键字、标识符、注释、常量和变量等核心概念。这部分是学习Java编程的基础,对于初学...

    java版本词法、语法分析器以及三地址代码生成实验源代码

    在这个实验中,我们使用Java编程语言实现了这些核心功能,这使得代码具有跨平台的特性,并且利用Java丰富的库资源来构建图形用户界面(GUI),提供更友好的交互体验。 词法分析,又称为扫描或词法分解,是编译器的...

    LR1语法分析器 java版本

    在这个Java版本的LR1语法分析器中,我们主要探讨以下几个关键知识点: 1. **LR分析器**: LR分析器是一种自底向上的语法分析方法,它通过构建一个分析表来决定如何根据输入符号串进行移进或归约操作。LR1分析器在LR...

    pl/0语言编译实验完整语法分析器java

    选择Java作为实现语法分析器的编程语言是因为其跨平台的特性,丰富的类库以及强大的面向对象编程能力。Java的抽象语法树(AST)和流处理API使得构建编译器组件更为便捷。 **实验学习价值** 这个Java实现的PL/0语言...

    语法语义分析

    在计算机科学领域,语法语义分析是编译器设计中的关键步骤,它是将高级语言转换为机器可理解的形式的关键过程。本文将详细讲解语法语义分析的各个方面,特别是算符优先算法及其应用。 首先,我们要了解什么是语法。...

    编译原理 课程设计 词法分析 语法分析 语义分析

    在这个课程设计中,我们将重点关注三个关键步骤:词法分析、语法分析和语义分析,这些都是编译器构建的重要组成部分。 **词法分析**是编译过程的第一步,也称为扫描或词法分解。它负责将源代码文本分解成一系列有...

    编译原理java实现所需jar包-个人博客文章配套资源

    在Java中,这包括检查变量是否已声明,类型是否匹配,以及程序是否符合语法规则。静态检查能尽早发现并报告错误,提高代码质量。 五、抽象语法树 抽象语法树(AST)是源代码语法结构的树形表示,每个节点代表一个...

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

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

    JDK19-java-se-language-updates.pdf

    Java 语言更新是 Java 平台的核心组件之一,负责定义 Java 语言的语法、语义和行为。在 Release 19 中,Java 语言更新包括了多个重要的变化和改进,例如: * Pattern Matching for instanceof: 在 Release 19 中,...

Global site tag (gtag.js) - Google Analytics