甲骨文-JavaSE7和JavaSE8
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
•
使用泛型前 List strList = new ArrayList(); 使用泛型
List<String> strList = new ArrayList<String>(); List<Map<String, List<String>> strList = new ArrayList<Map<String, List<String>>();
使用字符串 Switch 语句
int monthNameToDays(String s, int year) { switch(s) { case "April":case "June": case "September":case "November": return 30; case "January":case "March": case "May":case "July": case "August":case "December": return 31; case "February": ... default: ...
<在此处插入图片>
JavaSE 7 和 JavaSE 8
Lee Chuk Munn chuk-munn.lee@oracle.com
议题
• 模块化 • 细微语言更改 • 代码块参数 • 杂项
<在此处插入图片>
模块化
Jigsaw 项目
模块化 — 解决方案
•
“JAR 地狱”
– 消除类路径 – 打包模块以便于自动下载和安装 – 生成原生包 — deb、rpm、ips 等
module com.foo.app @ 1.0.0 { class com.foo.app.Main; requires com.foo.lib @ 2.1; provides com.foo.app.lib @ 1.0.0; }
com.foo.lib
虚拟模块
相关性
org.bar.lib edu.baz.util
可变参数警告
•
这些调用有何错误
– Arrays.asList(T... a) – EnumSet.of(E first, E... rest)
List<List<String>> monthsInTwoLanguages = Arrays.asList( Arrays.asList("January", "February"), Arrays.asList("一月", "二月") );
com.foo.lib
可选模块
org.bar.lib edu.baz.util
module-info.java
com.foo.app
module com.foo.secret @ 1 { permits com.foo.lib; }
com.foo.extra com.foo.lib
com.foo.secret
多重捕获
try { // Reflective operations calling Class.forName, // Class.newInstance, Class.getMethod, // Method.invoke, etc. } catch(final ClassNotFoundException | InstantiationException | NoSuchMethodException | InvocationTargetException e) { log(e); throw e; }
•
ຫໍສະໝຸດ Baidu
如何增强这段代码的可靠性?
InputStream in = null; OutputStream out = null; try { in = new FileInputStream(src); } catch (FileNotFoundException fne) { return; } try { out = new FileOutputStream(dst); try { byte[] buf = new byte[8192]; int n; while ((n = in.read(buf)) >= 0) out.write(buf, 0, n); } catch (IOException ioe) { //Do something } finally { try { out.flush(); out.close(); } catch (IOException ioe) { } } } catch (FileNoutFoundException fne) { } finally { try { in.close(); } catch (IOException ioe) { } }
module-info.java
com.foo.app
module com.foo.app @ 1.0.0 { com.foo.extra class com.foo.app.Main; requires com.foo.lib @ 2.1; provides com.foo.app.lib @ 1.0.0; requires optional com.foo.extra; }
API 支持
– 新接口 java.lang.AutoClosable – java.io.Closable – JDBC 4.1 改为使用 AutoClosable
Test.java:5:warning:[unchecked] unchecked generic array creation of type java.util.List<java.lang.String>[] for varargs parameter List<List<String>> monthsInTwoLanguages = Arrays.asList(
•
•
使用尖括号 (<>) 推断类型
List<String> strList = new ArrayList<>(); List<Map<String, List<String>> strList = new ArrayList<>();
大量异常
try { ... } catch(ClassNotFoundException cnfe) { log(cnfe); throw cnfe; } catch(InstantiationException ie) { log(ie); throw ie; } catch(NoSuchMethodException nsme) { log(nsme); throw nsme; } catch(InvocationTargetException ite) { log(ite); throw ite; }
•
通过以下方式可以抑制,但同时可能会抑制其他问题
– @SuppressWarnings(“unchecked) – 但可能会抑制其他合法问题
•
在声明 @SafeVarags 处指定新批注
@SafeVarags public static <T> List<T> asList(T... a)
使用 <>
•
性能 — 下载时间、启动时间
– 增量下载 → 快速类加载 – 记住启动类
•
平台可伸缩性 — 向下伸缩至小型设备
– SE 子集适用于小型设备
模块化目标
• • • • • •
分组 相关性 版本控制 封装 可选模块 虚拟模块
module-info.java
入口点 模块名称 版本
com.foo.app
List<String> list = ... for (String element:list) { ...
更好的整数串
•
二进制串
int mask = 0b101010101010;
使用下划线确保清晰易懂
•
int mask = 0b1010_1010_1010; long big = 9_223_783_036_967_937L;
http://download.java.net/jdk7/docs/api/java/lang/ReflectiveOperationException.html
复制流
InputStream in = new FileInputStream(src); OutputStream out = new FileOutputStream(dest); byte[] buf = new byte[8192]; int n; while ((n = in.read(buf)) >= 0) out.write(buf, 0, n);
Coin 项目
<在此处插入图片>
JDK 5 — 程序员效率
List<String> list = ... Iterator<String> listIter = list.iterator(); while (listIter.hasNext()) { String element = listIter.next(); ...
更准确的重抛
try { // Reflective operations calling Class.forName, // Class.newInstance, Class.getMethod, // Method.invoke, etc. } catch(final ReflectiveOperationException e) { //e means any of the subtype thrown from try {} log(e); throw e; ReflectiveOperationException } ClassNotFoundException InstantiationException NoSuchMethodException InvocationTargetException
•
创建和安装库
jmod -L mlib create jmod -L mlib install *.jmod
•
将信息库链接至库
jmod add-repo mlib http://jig.sfbay
•
执行
java -L mlib -m com.foo.app
Section Divider
微小 (语言) 变化
自动资源管理
try (InputStream in = new FileInputStream(src); OutputStream out = new FileOutputStream(ds)) { byte[] buf = new byte[8192]; int n; while ((n = in.read(buf)) >= 0) out.write(buf, 0, n); } •
封装模块
org.bar.lib edu.baz.util
打包模块
•
编译
javac -modulepath mods src/com/foo/...
•
打包 — 支持原生包格式
jpkg -modulepath mods jmod com.foo.app ... jpkg -modulepath mods debs com.foo.app ...
堆污染 — JLSv3 4.12.2.1
•
消除和缺乏具体化的后果
– Arrays.asList(“January”, February”) – 运行良好,但调用点会出现不友好的警告
•
类似于
List list = new LinkedList<String>(); List<String> strList = list;
字符串 Switch 语句
• •
如今,case 标签包括整数常量和枚举常量 字符串也是常量
目前可以识别字符串
int monthNameToDays(String s, int year) { if("April".equals(s) || "June".equals(s) || "September".equals(s) ||"November".equals(s)) return 30; if("January".equals(s) || "March".equals(s) || "May".equals(s) || "July".equals(s) || "August".equals(s) || "December".equals(s)) return 31; if("February".equals(s)) ...
使用泛型前 List strList = new ArrayList(); 使用泛型
List<String> strList = new ArrayList<String>(); List<Map<String, List<String>> strList = new ArrayList<Map<String, List<String>>();
使用字符串 Switch 语句
int monthNameToDays(String s, int year) { switch(s) { case "April":case "June": case "September":case "November": return 30; case "January":case "March": case "May":case "July": case "August":case "December": return 31; case "February": ... default: ...
<在此处插入图片>
JavaSE 7 和 JavaSE 8
Lee Chuk Munn chuk-munn.lee@oracle.com
议题
• 模块化 • 细微语言更改 • 代码块参数 • 杂项
<在此处插入图片>
模块化
Jigsaw 项目
模块化 — 解决方案
•
“JAR 地狱”
– 消除类路径 – 打包模块以便于自动下载和安装 – 生成原生包 — deb、rpm、ips 等
module com.foo.app @ 1.0.0 { class com.foo.app.Main; requires com.foo.lib @ 2.1; provides com.foo.app.lib @ 1.0.0; }
com.foo.lib
虚拟模块
相关性
org.bar.lib edu.baz.util
可变参数警告
•
这些调用有何错误
– Arrays.asList(T... a) – EnumSet.of(E first, E... rest)
List<List<String>> monthsInTwoLanguages = Arrays.asList( Arrays.asList("January", "February"), Arrays.asList("一月", "二月") );
com.foo.lib
可选模块
org.bar.lib edu.baz.util
module-info.java
com.foo.app
module com.foo.secret @ 1 { permits com.foo.lib; }
com.foo.extra com.foo.lib
com.foo.secret
多重捕获
try { // Reflective operations calling Class.forName, // Class.newInstance, Class.getMethod, // Method.invoke, etc. } catch(final ClassNotFoundException | InstantiationException | NoSuchMethodException | InvocationTargetException e) { log(e); throw e; }
•
ຫໍສະໝຸດ Baidu
如何增强这段代码的可靠性?
InputStream in = null; OutputStream out = null; try { in = new FileInputStream(src); } catch (FileNotFoundException fne) { return; } try { out = new FileOutputStream(dst); try { byte[] buf = new byte[8192]; int n; while ((n = in.read(buf)) >= 0) out.write(buf, 0, n); } catch (IOException ioe) { //Do something } finally { try { out.flush(); out.close(); } catch (IOException ioe) { } } } catch (FileNoutFoundException fne) { } finally { try { in.close(); } catch (IOException ioe) { } }
module-info.java
com.foo.app
module com.foo.app @ 1.0.0 { com.foo.extra class com.foo.app.Main; requires com.foo.lib @ 2.1; provides com.foo.app.lib @ 1.0.0; requires optional com.foo.extra; }
API 支持
– 新接口 java.lang.AutoClosable – java.io.Closable – JDBC 4.1 改为使用 AutoClosable
Test.java:5:warning:[unchecked] unchecked generic array creation of type java.util.List<java.lang.String>[] for varargs parameter List<List<String>> monthsInTwoLanguages = Arrays.asList(
•
•
使用尖括号 (<>) 推断类型
List<String> strList = new ArrayList<>(); List<Map<String, List<String>> strList = new ArrayList<>();
大量异常
try { ... } catch(ClassNotFoundException cnfe) { log(cnfe); throw cnfe; } catch(InstantiationException ie) { log(ie); throw ie; } catch(NoSuchMethodException nsme) { log(nsme); throw nsme; } catch(InvocationTargetException ite) { log(ite); throw ite; }
•
通过以下方式可以抑制,但同时可能会抑制其他问题
– @SuppressWarnings(“unchecked) – 但可能会抑制其他合法问题
•
在声明 @SafeVarags 处指定新批注
@SafeVarags public static <T> List<T> asList(T... a)
使用 <>
•
性能 — 下载时间、启动时间
– 增量下载 → 快速类加载 – 记住启动类
•
平台可伸缩性 — 向下伸缩至小型设备
– SE 子集适用于小型设备
模块化目标
• • • • • •
分组 相关性 版本控制 封装 可选模块 虚拟模块
module-info.java
入口点 模块名称 版本
com.foo.app
List<String> list = ... for (String element:list) { ...
更好的整数串
•
二进制串
int mask = 0b101010101010;
使用下划线确保清晰易懂
•
int mask = 0b1010_1010_1010; long big = 9_223_783_036_967_937L;
http://download.java.net/jdk7/docs/api/java/lang/ReflectiveOperationException.html
复制流
InputStream in = new FileInputStream(src); OutputStream out = new FileOutputStream(dest); byte[] buf = new byte[8192]; int n; while ((n = in.read(buf)) >= 0) out.write(buf, 0, n);
Coin 项目
<在此处插入图片>
JDK 5 — 程序员效率
List<String> list = ... Iterator<String> listIter = list.iterator(); while (listIter.hasNext()) { String element = listIter.next(); ...
更准确的重抛
try { // Reflective operations calling Class.forName, // Class.newInstance, Class.getMethod, // Method.invoke, etc. } catch(final ReflectiveOperationException e) { //e means any of the subtype thrown from try {} log(e); throw e; ReflectiveOperationException } ClassNotFoundException InstantiationException NoSuchMethodException InvocationTargetException
•
创建和安装库
jmod -L mlib create jmod -L mlib install *.jmod
•
将信息库链接至库
jmod add-repo mlib http://jig.sfbay
•
执行
java -L mlib -m com.foo.app
Section Divider
微小 (语言) 变化
自动资源管理
try (InputStream in = new FileInputStream(src); OutputStream out = new FileOutputStream(ds)) { byte[] buf = new byte[8192]; int n; while ((n = in.read(buf)) >= 0) out.write(buf, 0, n); } •
封装模块
org.bar.lib edu.baz.util
打包模块
•
编译
javac -modulepath mods src/com/foo/...
•
打包 — 支持原生包格式
jpkg -modulepath mods jmod com.foo.app ... jpkg -modulepath mods debs com.foo.app ...
堆污染 — JLSv3 4.12.2.1
•
消除和缺乏具体化的后果
– Arrays.asList(“January”, February”) – 运行良好,但调用点会出现不友好的警告
•
类似于
List list = new LinkedList<String>(); List<String> strList = list;
字符串 Switch 语句
• •
如今,case 标签包括整数常量和枚举常量 字符串也是常量
目前可以识别字符串
int monthNameToDays(String s, int year) { if("April".equals(s) || "June".equals(s) || "September".equals(s) ||"November".equals(s)) return 30; if("January".equals(s) || "March".equals(s) || "May".equals(s) || "July".equals(s) || "August".equals(s) || "December".equals(s)) return 31; if("February".equals(s)) ...