java编程151条建议

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
-------------------- 复写长方法注意事项
# java 通用方法规则
1. 不要再常量和变量中使用混淆字母,使用字母'l'作为长整型标志时写成大写'L'
2. 常量值在运行期不变
3. 三元操作符返回数据类型要一致
4. 避免带有变长参数的方法重载
5. 别让bull值和控制威胁到变长方法
6. 复写变长方法也循规蹈矩. 
7. 警惕自增陷阱
8. 不要让旧语法困扰你
9. 少用静态导入
10. 不要再本类中覆盖静态导入的变量和方法
11. 养成好习惯,显示声明uid 
12. 比便用序列化类在构造函数中为不变量赋值
13. 避免fina变量复杂赋值
14. 使用序列化类的私有方法巧妙解决副本属性持久化问题
15. break 万万不能忘
16. 易变业务使用脚本语言编写
17. 慎用动态编译
18. 避免instanceof 非预期结果
19. 断言绝对不是鸡肋
20. 不要只替换一个类

# 本类型
21. 用偶判断,不用奇判断
22. 整数类型处理货币
23. 不要让整个类型默默转换
24. 边界,边界,还是边界
25. 不要让四舍五入亏了一方
26. 敌方包装类型的null值
27. 谨慎包装类型的大小比较
28. 优先使用整型池 Integer.valueOf
29. 优先选择基本类型
30. 不要随便设置随机种子

# 类-对象-方法
31. 在接口中不要存在实现代码
32. 静态变量一定要先申明后赋值
33. 不要覆写静态方法
34. 构造方法尽量简化
35. 避免在构造函数中初始化其他类
36. 使用构造代码块精炼程序(构造代码块)(静态代码块)(同步代码块)(普通代码块)
37. 构造代码块会想你所想
38. 使用静态内部类提高封装性(形似内部类,神似外部类)
39. 使用匿名类的构造函数
40. 匿名类的构造函数很特殊(先调用父类的同参构造在调用构造代码块)
41. 让多重继承成为现实(使用内部类或者匿名内部类来实现)
42. 让工具类不可实例化
43. 避免对象浅拷贝
44. 推荐使用序列化实现对象拷贝
45. 覆写equals方法时不要识别不出自己
46. equals 应该考虑空值
47. 在equals中使用getClass进行类型判断
48. 覆写equals方法必须覆写hashCode方法
49. 推荐覆写toString 方法
50. 使用package-info类为包服务
51. 不要主动进行垃圾回收

---------------- jdk api 使用注意事项
# 字符串
52. 推荐使用String 直接量赋值
53. 注意方法中传递的参数要求
54. 正确使用String、StringBuffer、StringBuilder
55. 注意字符串的位置
56. 自由选择字符串的拼接方式
57. 推荐在复杂字符串操作使用正则表达式
58. 强烈建议使用utf编码
59. 对字符串排序持一种宽容态度

# 数组和集合
60. 性能考虑,数组是首选
61. 若有必要,使用变长数组
62. 警惕数组的浅拷贝
63. 在明确的场景下,为集合指定初始化容器
64. 多种最值算法,适时选择
65. 避开基本类型数组转列表陷阱
66. asList方法产生的List对象不可更改
67. 不同列表选择不同的遍历方式
68. 频繁插入和删除时使用LinkedList
69. 列表相等只关心元素数据
70. 子列表只是原列表的一个视图
71. 推荐使用subList处理局部列表
72. 生成子列表后不要再操作原列表
73. 使用Comparator进行排序
74. 不推荐使用binarySearch对列表进行搜索
75. 集合元素必须做到compareTo和equals同步
76. 集合运算时使用更优雅的方式
77. 使用shuffle打乱列表
78. 减少HashMap中元素的数量
79. 集合中的哈希码不要重复
80. 多线程使用vector 或 hasTable
81. 非稳定排序推荐是使用List
82. 由点及面,一叶知秋---集合大家族
# 枚举和注解
83. 推荐使用枚举定义常量
84. 使用构造函数协助描述枚举项
85. 小心switch带来的空值异常
86. 在swithc的default代码中增加AssertionError错误
87. 使用valueOf前必须进行校验
88. 枚举实现工厂方法模式更简洁
89. 枚举项的数量限制在64个以内
90. 小心注解继承
91. 枚举和注解结合使用威力更大
92. 注意@Override不同版本的区别

# 泛型和反射
93. java 的泛型时类型擦除的
94. 不能初始化泛型参数和数组
95. 强制声明泛型的实际类型
96. 不同的场景使用不同的泛型通配符
97. 警惕泛型时不能协变和逆变的
98. 建议采用的顺序时List<T> List<?> List<Object>
99. 严格限定泛型类型采用多重界限
100. 数组的真实类型必须是泛型类型的子类型
101. 注意Class类的特殊性
102. 适时选择getDeclared-- 和 get-- 方法
103. 反射访问属性或方法时accessible 设为true
104. 使用forName动态加载类文件
105. 动态加载不适合数组
106. 动态代理可以使代理模式更加灵活
107. 使用反射增加装饰模式的普适性
108. 反射让模板方法模式更强大
109. 不需要太多关注反射效率

# 异常
110. 提倡异常封装
111. 采用异常链传递异常
112. 受检异常尽可能转化为非受检异常
113. 不要再finally块中处理返回值
114. 不要再构造函数中抛出异常
115. 使用Throwable 获取栈信息
116. 异常只为异常服务
117. 多使用异常,把性能问题放一边

# 多线程和并发
118. 不推荐覆写start方法
119. 启动线程前stop方法是不可靠的
120. 不使用stop方法停止线程
121. 线程优先级只使用三个等级
122. 使用线程异常处理器提升系统可靠性
123. volatile不能保证数据同步
124. 异步运算考虑使用Callable接口
125. 优先选择线程池


------------------ 性能 开源 工具 框架
# 性能和效率

# 开源世界

# 思想为源

-----------------
show it , do it , answer it , fix it , broadcast it ,tune it