今天的帖子将带我们了解Project Coin的每个功能-一系列小的语言增强功能,这些功能虽然不是开创性的,但是对于任何能够使用JDK 7的开发人员来说都是有用的。
我提出了一个银行帐户课程,该课程展示了Project Coin功能的基础知识。
看一看…
public class ProjectCoinBanker {
private static final Integer ONE_MILLION = 1_000_000;
private static final String RICH_MSG = "You need more than $%,d to be considered rich.";
public static void main(String[] args) throws Exception {
System.out.println(String.format(RICH_MSG, ONE_MILLION));
String requestType = args[0];
String accountId = args[1];
switch (requestType) {
case "displayBalance":
printBalance(accountId);
break;
case "lastActivityDate" :
printLastActivityDate(accountId);
break;
case "amIRich" :
amIRich(accountId);
break;
case "lastTransactions" :
printLastTransactions(accountId, Integer.parseInt(args[2]));
break;
case "averageDailyBalance" :
printAverageDailyBalance(accountId);
break;
default: break;
}
}
private static void printAverageDailyBalance(String accountId) {
String sql = String.format(AVERAGE_DAILY_BALANCE_QUERY, accountId);
try (
PreparedStatement s = _conn.prepareStatement(sql);
ResultSet rs = s.executeQuery();
) {
while (rs.next()) {
//print the average daily balance results
}
} catch (SQLException e) {
// handle exception, but no need for finally to close resources
for (Throwable t : e.getSuppressed()) {
System.out.println("Suppressed exception message is " + t.getMessage());
}
}
}
private static void printLastTransactions(String accountId, int numberOfTransactions) {
List transactions = new ArrayList<>();
//... handle fetching/printing transactions
}
private static void printBalance(String accountId) {
try {
BigDecimal balance = getBalance(accountId);
//print balance
} catch (AccountFrozenException | ComplianceViolationException | AccountClosedException e) {
System.err.println("Please see your local branch for help with your account.");
}
}
private static void amIRich(String accountId) {
try {
BigDecimal balance = getBalance(accountId);
//find out if the account holder is rich
} catch (AccountFrozenException | ComplianceViolationException | AccountClosedException e) {
System.out.println("Please see your local branch for help with your account.");
}
}
private static BigDecimal getBalance(String acccountId)
throws AccountFrozenException, AccountClosedException, ComplianceViolationException {
//... getBalance functionality
}
}
简要地说,我们的ProjectCoinBanker类演示了以下Project Coin功能的基本用法。
- 数字文字下划线
- 开关中的弦
- 多渔获
- 用于创建类型化对象的类型推断
- 尝试使用资源和抑制的异常
首先,数字文字中的下划线很容易解释。 我们的例子
private static final Integer ONE_MILLION = 1_000_000;
表明好处是视觉的。 开发人员可以快速查看代码以验证值是否符合预期。 下划线可以在自然分组位置以外的其他地方使用,无论放置在何处。 数字文字中的下划线不能以数字文字开头或结尾,否则,您可以随意将它们放在所需的位置。 尽管此处未进行演示,但还添加了二进制文字支持。 与十六进制文字以0x或0X前缀相同的方式,二进制文字将以0b或0B前缀。
开关中的字符串也是不言自明的。 现在,switch语句也接受String。 在我们的示例中,我们打开传递给main方法的String参数来确定发出了什么请求。 附带说明,这纯粹是一个编译器实现,带有指示,可能会在以后添加JVM对String的支持。
类型推断是另一个易于理解的改进。 现在代替我们的旧代码
List<Transaction> transactions = new ArrayList<Transaction>();
我们可以做
List<Transaction> transactions = new ArrayList<>();
因为可以推断类型。 自从引入泛型以来,可能找不到任何人会辩称不应该这样做,但是现在就在这里。
多次捕获对于异常处理代码的简洁性来说非常有用。 想要实际基于抛出的异常类型来做某事的次数太多了,直到现在,我们被迫拥有多个catch块,它们基本上都在做同一件事。 新语法非常干净和合乎逻辑。 我们的例子
catch (AccountFrozenException | ComplianceViolationException | AccountClosedException e)
显示了如何轻松完成。
最后,Project Coin功能的最后一个演示是尝试使用资源语法并支持检索抑制的异常。 引入了一个新的接口AutoCloseable ,该接口已应用于所有预期的可疑对象,包括Input / OutputStreams,读取器/编写器,通道,套接字,选择器和java.sql资源Statement,ResultSet和Connection。 在我看来,语法不像多捕获更改那样自然,并不是说我有其他选择。
try (
PreparedStatement s = _conn.prepareStatement(sql);
ResultSet rs = s.executeQuery();
) {
while (rs.next()) {
//print the average daily balance results
}
} catch (SQLException e) {
//handle exception, but no need for finally to close resources
for (Throwable t : e.getSuppressed()) {
System.out.println("Suppressed exception message is " + t.getMessage());
}
}
首先,我们看到可以在尝试使用资源时包含多个资源-非常好。 我们甚至可以在与PreparedStatement相同的块中引用先前声明的资源。 我们仍然可以处理我们的异常,但是我们不需要关闭finally块来关闭资源。 还要注意, Throwable上有一个新方法getSuppressed() 。 这使我们可以访问试图“自动关闭”声明的资源时抛出的所有异常。 每个声明的资源最多可以有一个抑制的异常。 注意:如果资源初始化引发异常,它将在声明的catch块中处理。
而已。 没有什么破天荒的事情,但是我们可以不用太多麻烦就可以开始使用的一些简单增强功能。 Project Coin还包括有关varargs和编译器警告的功能。 本质上,它归结为一个新的注释(@SafeVarargs),可以在方法声明中应用该注释,以允许开发人员从其使用的代码中删除@SuppressWarnings(“ varargs”)。 这已应用于JDK中的所有关键可疑对象,但是在任何通用varags方法中都可以使用相同的注释。
在线描述的项目代币功能集充其量是不一致的。 希望这会给您关于JDK 7提案中可以使用的内容的完整摘要。
参考: JCG合作伙伴的 Java 7 –项目硬币功能概述 在Carfey Software Blog上 。
翻译自: https://www.javacodegeeks.com/2011/11/java-7-feature-overview.html