这一提案是为了加强自Java 1.1即引入的嵌套类设计。java
嵌套类主要有两个用处。json
第一是由于其只使用于很短的代码块中,在Java8以前,这主要依靠实现一个匿名类来完成。Java8以后,这种用法能够被lambda表达取代。app
另外一种用法是由于须要访问另外一个类的内部。嵌套类具备和成员变量以及成员方法相同的访问权限。异步
JEP181主要是为了解决JVM级别的权限与源码权限不一致的问题。async
public class JEP181 { public class Nest1 { private int var1; public void doSome() throws Exception { final Nest2 nest2 = new Nest2(); nest2.var2 = 2; System.out.println(nest2.var2); final Field f2 = Nest2.class.getDeclaredField("var2"); f2.setInt(nest2, 2); System.out.println(nest2.var2); } } public class Nest2 { private int var2; } public static void main(String[] args) throws Exception { JEP181 jep181 = new JEP181(); JEP181.Nest1 nest1 = jep181.new Nest1(); nest1.doSome(); } } result: java 11: 2 2 java 8: java.lang.IllegalAccessException
这一段代码在Java8中是不正确的。会抛出java.lang.IllegalAccessException
。主要问题出在f2.setInt(nest2,2)
,这里因为在Nest2
中是private的,因此没法直接set值。可是却又能够直接调用nest2.var2=2
来设置该值,由于嵌套类是能够访问别的嵌套类的私有属性的。Java 11修复了这个使人困惑的现象。ui
JEP 181 官方介绍
A field or method R is accessible to a class or interface D if and only if any of the following conditions are true:
...
R is private and is declared in a different class or interface C, and C and D, are nestmates
HttpClient
在Java9开始引入,Java10对此有所更新。Java11根据一些反馈对API进行了一些改进,可是大部分都没有变化。该API经过CompletableFutures提供了非阻塞request和response,
关于请求和响应的背压机制以及流控制都由Java11新提供的Flow API来提供。debug
虽然API没有什么变化,可是实现几乎所有重写了。Java11的所有实现都是异步的(Java9,10的Http/1.1的实现是阻塞的).设计
static void syncGet() throws IOException, InterruptedException, URISyntaxException { HttpClient httpClient = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("http://www.baidu.com")) .timeout(Duration.ofSeconds(20)) .header("Content-Type", "application/json") .build(); HttpResponse<Path> response = httpClient.send(request, HttpResponse.BodyHandlers.ofFile(Paths.get("abc.txt"))); log.debug("Response status code: " + response.statusCode()); log.debug("Response headers: " + response.headers()); log.debug("Response body: " + response.body()); }
关于同步的用法都比较简单,和别的不少http库的设计也比较相像。code
static void asyncGet() { HttpClient httpClient = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("http://www.baidu.com")) .build(); CompletableFuture<String> strResponse = httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body); strResponse.whenComplete((resp, t) -> { if (t != null) { log.debug(t.getMessage()); } else { log.debug(resp); } }).join(); }
Java 9,Java 10引入了var用来简化声明变量的过程,Java 11进一步加强了该特性。get
list.sort((@NotNull var t1, @NotNull var t2) -> { if (t1.equals(t2)) { return 0; } return t1 > t2 ? 1 : -1; });
在Java 11以前,上述代码未能正确执行。(var x, var y)->...
在通常状况下并无什么用,可是若是须要给lambda表达式变量添加注解的话,那么lambda中可使用var就有了做用。