acc8226 的博客

1. 【强制】关于 hashCode 和 equals 的处理,遵循如下规则:

  1. 只要覆写 equals,就必须覆写 hashCode。
  2. 因为 Set 存储的是不重复的对象,依据 hashCode 和 equals 进行判断,所以 Set 存储的对象必须覆写这两种方法。
  3. 如果自定义对象作为 Map 的键,那么必须覆写 hashCode 和 equals。

说明:String 因为覆写了 hashCode 和 equals 方法,所以可以愉快地将 String 对象作为 key 来使用。

我的笔记:《Effective Java》告诉我们重写 hashcode 方法的最佳实践方式。
一个好的 hashcode 方法通常最好是不相等的对象产生不相等的 hash 值,理想情况下,hashcode方法应该把集合中不相等的实例均匀分布到所有可能的 hash 值上面。在企业开发中,最好使用第三方库如 Apache commons 来生成hashocde方法。

2. 【强制】判断所有集合内部的元素是否为空,使用 isEmpty() 方法,而不是 size() == 0 的方式。

说明:在某些集合中,前者的时间复杂度为 O(1),而且可读性更好。

3.【强制】在使用 java.util.stream.Collectors 类的 toMap() 方法转为 Map 集合时,一定要使用参数类型 为 BinaryOperator,参数名为 mergeFunction 的方法,否则当出现相同 key 时会抛出 IllegalStateException 异常。

阅读全文 »

1. 【强制】避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成本,直接用 类名来访问即可。

2. 【强制】所有的覆写方法,必须加 @Override 注解。

说明:getObject()get0bject() 的问题。一个是字母的 O,一个是数字的 0,加 @Override 可以准确判断是否覆盖 成功。另外,如果在抽象类中对方法签名进行修改,其实现类会马上编译报错。

3. 【强制】相同参数类型,相同业务含义,才可以使用的可变参数,参数类型避免定义为 Object。

说明:可变参数必须放置在参数列表的最后。(建议开发者尽量不用可变参数编程)
正例:public List<User> listUsers(String type, Long... ids) {...}

4. 【强制】外部正在调用的接口或者二方库依赖的接口,不允许修改方法签名,避免对接口调用方产生影 响。接口过时必须加 @Deprecated 注解,并清晰地说明采用的新接口或者新服务是什么。

  • 设计时没有考虑周全,需要改造接口,需要通过增加新接口,迁移后下线老接口的方式实现。
  • REST接口只能增加参数,不能减少参数,返回值的内容也是只增不减。

5. 【强制】不能使用过时的类或方法。

阅读全文 »

1. 【强制】如果大括号内为空,简洁地写成 {} 即可,大括号中间无需换行和空格;如果是非空代码块,则:
1)左大括号前不换行。
2)左大括号后换行。
3)右大括号前换行。
4)右大括号后还有 else 等代码则不换行;表示终止的右大括号后必须换行。

2. 【强制】左小括号和右边相邻字符之间不需要空格;右小括号和左边相邻字符之间也不需要空格;而左大 括号前需要加空格。详见第 5 条下方正例提示。
反例:if(空格 a == b 空格)

3. 【强制】if / for / while / switch / do 等保留字与左右括号之间都必须加空格。

4. 【强制】任何二目、三目运算符的左右两边都需要加一个空格。
说明:包括赋值运算符 =、逻辑运算符 &&、加减乘除符号等。

5. 【强制】采用 4 个空格缩进,禁止使用 Tab 字符。

说明:如使用 Tab 缩进,必须设置 1 个 Tab 为 4 个空格。
IDEA 设置 Tab 为 4 个空格时,请勿勾选 Use tab character;
Eclipse 设置中,找到 tab policy 设置为 Spaces only,Tab size:4,最后必须勾选 insert spaces for tabs

阅读全文 »

目前,见到的类、接口和枚举类型都定义为顶层类型。也就是说,都是包的直接成员,独立于其他类型。不过,类型还可以嵌套在其他类型中定义。这种类型是嵌套类型(nested type),一般称为“内部类”,是 Java 语言的一个强大功能。

嵌套类型的使用目的,都和封装有关。
内部类只是 Java 编译器的概念,对于Java虚拟机而言,它是不知道内部类这回事的,每个内部类最后都会被编译为一个独立的类,生成一个独立的字节码文件。也就是说,每个内部类其实都可以被替换为一个独立的类。当然,这是单纯就技术实现而言。
内部类可以方便地访问外部类的私有变量,可以声明为 private 从而实现对外完全隐藏,相关代码写在一起,写法也更为简洁,这些都是内部类的好处。

嵌套类型也可以理解为通过某种方式和其他类型绑定在一起的类型,不作为完全独立的实体真实存在。类型能通过四种不同的方式嵌套在其他类型中。

提示内部类编译成功后生成的字节码文件是“外部类$内部类.class”。

1. 静态成员类型 / 静态内嵌类
静态成员类型是定义为其他类型静态成员的类型。嵌套的接口、枚举和注解始终都是静态成员类型(就算不使用 static 关键字也是)。

2. 非静态成员类/成员内部类
“非静态成员类型”就是没使用 static 声明的成员类型。只有类才能作为非静态成员类型。

阅读全文 »

1. 【强制】所有编程相关的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。
反例:_name / __name / $Object / name_ / name$ / Object$

2. 【强制】所有编程相关的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。
说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。注意,即使纯拼音命名方式也要避免采用。
正例:ali / alibaba / taobao / kaikeba / aliyun / youku / hangzhou 等国际通用的名称,可视同英文。
反例:DaZhePromotion【打折】/ getPingfenByName()【评分】 / String fw【福娃】/ int 变量名 = 3

3. 【强制】代码和注释中都要避免使用任何人类语言中的种族歧视性或侮辱性词语。
正例: blockList / allowList / secondary
反例:blackList / whiteList / slave / SB / WTF

4. 【强制】类名使用 UpperCamelCase 风格,以下情形例外:DO / PO / DTO / BO / VO / UID 等。
正例: ForceCode / UserDO / HtmlDTO / XmlService / TcpUdpDeal / TaPromotion
反例: forcecode / UserDo / HTMLDto / XMLService / TCPUDPDeal / TAPromotion

5. 【强制】方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格。
正例:localValue / getHttpMessage() / inputUserId

阅读全文 »
0%