丙午🐎年

acc8226 的博客

1.【强制】在一个 switch 块内,每个 case 要么通过 continue / break / return 等来终止,要么注释说明
程序将继续执行到哪一个 case 为止;在一个 switch 块内,都必须包含一个 default 语句并且放在最
后,即使它什么代码也没有。
说明:注意 break 是退出 switch 语句块,而 return 是退出方法体。

2.【强制】当 switch 括号内的变量类型为 String 并且此变量为外部参数时,必须先进行 null 判断。
反例:如下的代码输出是什么?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class SwitchString {
public static void main(String[] args) {
method(null);
}
public static void method(String param) {
switch (param) {
// 肯定不是进入这里
case "sth":
System.out.println("it's sth");
break;
// 也不是进入这里
case "null":
System.out.println("it's null");
break;
// 也不是进入这里
default:
System.out.println("default");
}
}
}
阅读全文 »

1. 【强制】获取单例对象需要保证线程安全,其中的方法也要保证线程安全。
说明:资源驱动类、工具类、单例工厂类都需要注意。

2. 【强制】创建线程或线程池时请指定有意义的线程名称,方便出错时回溯。
正例:自定义线程工厂,并且根据外部特征进行分组,比如,来自同一机房的调用,把机房编号赋值给
whatFeatureOfGroup:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class UserThreadFactory implements ThreadFactory {

private final String namePrefix;
private final AtomicInteger nextId = new AtomicInteger(1);
// 定义线程组名称,在利用 jstack 来排查问题时,非常有帮助
UserThreadFactory(String whatFeatureOfGroup) {
namePrefix = "FromUserThreadFactory's" + whatFeatureOfGroup + "-Worker-";
}

@Override
public Thread newThread(Runnable task) {
String name = namePrefix + nextId.getAndIncrement();
Thread thread = new Thread(null, task, name, 0, false);
System.out.println(thread.getName());
return thread;
}
}
阅读全文 »

以下推荐的软件尽量选择不含广告的版本,像百度阅读和多看自带广告这种就没入榜了。

win

常规阅读

记事本即可

书籍阅读

主要有 mobi / epub 格式

【win】[Sumatra PDF] is a PDF, ePub, MOBI, CHM, XPS, DjVu, CBZ, CBR reader for Windows. 且提供安装版和绿色版,小巧好用

阅读全文 »

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. 【强制】不能使用过时的类或方法。

阅读全文 »
0%