阿里巴巴java开发手册pdf 泰山版_阿里巴巴java技术图谱

阿里巴巴java开发手册pdf 泰山版_阿里巴巴java技术图谱说起华山,我就想起岳不群,不,令狐冲;说起泰山,我就想起司马迁,他的那句名言“人总有一死,或重于泰山,或轻于鸿毛”,真的发人深省啊。这就意味着,阿里出品的泰山版 Java 开发手册,是迄今为止最重量级的。 华山版是上个版本,啥时候更新的呢?2019 年 06 月 13 号,距离…

说起华山,我就想起岳不群,不,令狐冲;说起泰山,我就想起司马迁,他的那句名言“人总有一死,或重于泰山,或轻于鸿毛”,真的发人深省啊。这就意味着,阿里出品的泰山版 Java 开发手册,是迄今为止最重量级的。

华山版是上个版本,啥时候更新的呢?2019 年 06 月 13 号,距离现在 10 个月了,时间也不短了,是时候更新了。

新版都更新了哪些内容呢?可以从官方的版本历史中看得出来。

01、发布错误码统一解决方案

阿里巴巴java开发手册pdf 泰山版_阿里巴巴java技术图谱

错误码用来干嘛呢?答案是异常日志,方便我们快速知晓错误来源,判断是谁那出的问题。上图中 A 表示错误来源于用户;还有 B 级的,表示错误来源于当前系统;C 级的,表示错误来源于第三方服务,比如 CDN 服务器。

这个解决方案还是值得借鉴的,很多成熟的系统都在使用错误码,如果你对接过微信支付的话,应该对错误码不会感到陌生。看到错误码,然后在手册中搜索一下,就能快速知晓错误的类型,还是很不错的。

02、新增 34 条新的规约

34 条太多了,我就挑几个重要的拉出来说一说吧。

1)日期时间

还记得上次技术圈的刷屏事件吧?就是那个 YYYY 和 yyyy 造成的问题。大写的 Y 表示的是当天所在的这一周是属于哪个年份的,小写的 y 表示的是当天所在的年份,差别还是挺大的。你品,你细品。

还有,大写的 M 和 小写的 m 是不同的,大写的 H 和小写的 h 也是不同的。

阿里巴巴java开发手册pdf 泰山版_阿里巴巴java技术图谱

另外,像获取当前毫秒数应该使用 System.currentTimeMillis(),而不是 new Date().getTime(),这些细致的规约,都应该牢记在心中,不要去犯这些低级的错误。

2)三目运算的 NPE 问题

说实话,这个问题我之前从来没有注意,这次看到了,就一起来学习一下。先来看下面这段代码:

public class TestCondition {
    public static void main(String[] args) {
        Integer a = 1;
        Integer b = 2;
        Integer c = null;
        Boolean flag = false;
        Integer result = flag ? a * b : c;
    }
}

条件 a * b 属于算术运算,它俩相乘后的结果是一个 int 类型,这就会导致 c 这个 Integer 类型自动拆箱,由于值为 null,就抛出了以下错误:

Exception in thread "main" java.lang.NullPointerException
	at com.cmower.mkyong.TestCondition.main(TestCondition.java:9)

那可能你会感到好奇,为什么两个 Integer 类型的变量相乘后会是一个 int 类型呢,这主要是由编译器决定的,它就是这么设计的,来看一下反编译后的字节码:

public class TestCondition
{
    public static void main(String args[])
    {
        Integer a = Integer.valueOf(1);
        Integer b = Integer.valueOf(2);
        Integer c = null;
        Boolean flag = Boolean.valueOf(false);
        Integer result = Integer.valueOf(flag.booleanValue() ? a.intValue() * b.intValue() : c.intValue());
    }
}

a * b 时发生了自动拆箱,调用了 intValue() 方法,而三元运算的两个表达式的类型必须一致,这就导致 c 也调用了 intValue() 方法,由于 c 本身为 null,那就只能 NPE 了。明白了吧?

3)Collectors 类的 toMap() 方法

手册上说,在使用 java.util.stream.Collectors 类的 toMap() 方法转 Map 时,一定要使用含有参数类型为 BinaryOperator,参数名为 mergeFunction 的方法,否则当出现相同 key 值时会抛出 IllegalStateException 异常。

这段话可能理解上有点难度,那先来看一段代码吧!

String[] departments = new String[] {"沉默王二", "沉默王二", "沉默王三"};
Map<Integer, String> map = Arrays.stream(departments)
        .collect(Collectors.toMap(String::hashCode, str -> str));

运行这段代码的时候,就会抛出异常,堆栈信息如下所示:

Exception in thread "main" java.lang.IllegalStateException: Duplicate key 867758096 (attempted merging values 沉默王二 and 沉默王二)
	at java.base/java.util.stream.Collectors.duplicateKeyException(Collectors.java:133)
	at java.base/java.util.stream.Collectors.lambda$uniqKeysMapAccumulator$1(Collectors.java:180)

key 重复了,因为两个“沉默王二”的 hashCode 相同,那这时候的解决办法呢?

String[] departments = new String[] {"沉默王二", "沉默王二", "沉默王三"};
Map<Integer, String> map = Arrays.stream(departments)
        .collect(Collectors.toMap(String::hashCode, str -> str, (v1, v2) -> v2));

多加个参数 (v1, v2) -> v2,也就是重复的时候选一个。来看看此时调用的 toMap() 方法吧。

public static <T, K, U>
Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator<U> mergeFunction) {
    return toMap(keyMapper, valueMapper, mergeFunction, HashMap::new);
}

BinaryOperator 和 mergeFunction 是不是出现了?

03、修改描述 90 处

手册上说,比如,阻塞等待锁、建表的小数类型等描述有修改,我特么花了半个小时也没有找出来和上一个版本之间的差别。

泰山版

华山版

不知道是不是手册的小编在瞎说,你要是能发现差别,告诉我一声。

04、完善若干处示例

比如说 SQL 语句栏目里的 ISNULL 的示例,确实比华山版追加了一个更详细的反例,见下图。

阿里巴巴java开发手册pdf 泰山版_阿里巴巴java技术图谱

但说实话,这段反例的描述我看了至少六遍才搞懂是什么意思。首先,不要在 null 前换行,影响阅读性,这倒是真的;其次呢,不要使用 column is null 进行判空,使用 ISNULL(column) 判空,效率更高,也不会出现换行的情况。

select * from cms_subject where column is null and
column1 is not null;

select * from cms_subject where ISNULL(column) and column1 is not null;

05、最后

2016 年 12 月份,阿里首次向业界开放了这份《Java 开发手册》,到泰山版发布,已经过去了 3 年多时间了,这份手册也在全球 Java 开发者共同的努力下,成为业界普遍遵循的开发规范。这份手册包含的知识点非常全面,七大维度编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程规约、设计规约都有罗列。

如果你想成为一名优秀的 Java 工程师,那么这份手册上的内容几乎是必须要掌握的。如果你手上还没有这份手册,可以微信搜索「沉默王二」回复「手册」免费获取。已经有了的小伙伴,请忽略。最后,我衷心地祝福你,希望你能学有所成,to be better,奥利给!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13471.html

(0)

相关推荐

  • Python Append函数:在列表末尾添加元素

    Python Append函数:在列表末尾添加元素列表(list)是Python中最常用的一种数据结构,它是有序的集合,可以保存任意类型的元素,包括数字、字符串、对象等。Python中的列表是可变的,也就是说,在创建了一个列表之后,还可以添加、删除、修改其中的元素。

    2024-02-08
    105
  • Python os.path join函数的用法及示例说明

    Python os.path join函数的用法及示例说明在Python的os.path模块中,join()函数被广泛应用于路径的组合,它使用操作系统特定的分隔符将多个路径组合成一个。在不同的操作系统中,路径的分隔符是不同的,在Windows中是”\\”,在Linux和Unix中是”/”。使用os.path.join()函数,我们可以轻松地处理这些不同的细节,生成可以在不同操作系统上运行的路径。

    2024-03-06
    97
  • T-SQL编程

    T-SQL编程T-SQL(Transact-SQL)是一种 SQL 扩展语言,由微软实现,运行在 Ms SQL Server 平台上。T-SQL 主要用来和SQL Server 交流,而查询语句则主要用来告诉服务器

    2023-02-22
    147
  • 【StoneDB】从库如何规避不支持的DML和DDL

    【StoneDB】从库如何规避不支持的DML和DDL(以下情况仅针对StoneDB 1.0版本不支持的部分DML和DDL操作,StoneDB 2.0及以上版本将无需此类操作) 主从复制中,主库的任何更新都会同步到从库,如果从库不想重做主库的某个更新动作

    2023-05-31
    152
  • Python字典基础教程

    Python字典基础教程Python是一门十分强大的编程语言,它拥有丰富的数据结构种类,其中字典(dictionary)也是其中一种常用的数据结构之一。字典是Python中用于存储键值对的数据类型,它常用于实现非常复杂的数据处理,比如数据库的访问等。本篇文章将会对Python字典的基础知识进行详细介绍,帮助读者在日常编程中更好地理解和使用字典。

    2024-04-16
    81
  • SSL加密_ssl安全错误 sql

    SSL加密_ssl安全错误 sqlMsSQL使用加密连接SSL/TLS 说明 应用程序通过未加密的通道与数据库服务器通信, 这可能会造成重大的安全风险。在这种情况下, 攻击者可以修改用户输入的数据, 甚至对数据库服务器执行任意 SQL

    2022-12-26
    151
  • MAC dyld: Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib

    MAC dyld: Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylibbrew install python3安装python3后导致openssl升级到1.1,但mysqldump还是依赖的1.0.0,从而导致mysqldump时提示 dyld: Library n…

    2023-03-20
    161
  • JetBrains IntelliJ IDEA 优化教程

    JetBrains IntelliJ IDEA 优化教程JetBrainsIntelliJIDEA分为两个版本:旗舰版(Ultimate)和社区版(Community)。旗舰版收费(30天免费使用时间,功能齐全);社区版(永久免费,功能略有缺失,日常开发够用)。

    2023-03-23
    329

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注