- 私有化类构造器
- 每个方法抛出的异常都要有文档
- Stream使用注意事项(与直接使用hashMap的区别)
- value值不能为null, 避免转换时key重复导致的Duplicate key错误
- 不能重复使用
- 避免利用Stream来处理char值
- 静态工厂方法和公共构造方法都有它们的用途,并且了解它们的相对优点是值得的。通常静态工厂更可取,因此避免在没有考虑静态工厂的情况下,直接选择使用或提供公共构造方法。
- 当设计类的构造方法或静态工厂的参数超过几个时,Builder 模式是一个不错的选择,特别是许多参数是可选的或相同类型的。builder 模式客户端代码比使用伸缩构造方法(telescoping constructors)更容易读写,并且 builder 模式比 JavaBeans 更安全
- 使用私有构造方法或枚类实现 Singleton 属性
// Singleton with static factory
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() { ... }
public static Elvis getInstance()
{
return INSTANCE;
}
public void leaveTheBuilding() { ... } }
所有对 Elvis.getInstance 的调用都返回相同的对象引用,并且不会创建其他的 Elvis 实例(与前面提到的警告相同)
- 使用私有构造器执行非实例化。偶尔你会想写一个只包含静态方法和静态字段的类。这些类的名声非常不好,因为有些人滥用这些类从而避免以面向对象方式思考从而编写过程化的程序,但是它们确实有着特殊的用途。
// Noninstantiable utility class
public class UtilityClass
{
// Suppress default constructor for noninstantiability
private UtilityClass() {
throw new AssertionError();
}... // Remainder omitted }
- 依赖注入优于硬连接资源(hardwiring resources)
- 避免创建不必要的对象
- 优先使用基本类型而不是装箱的基本 类型,也要注意无意识的自动装箱
- 消除过期的对象引用
- 当一个类自己管理内存时,程序员应该警惕内存泄漏问题。
- 使用 try-with-resources 语句替代 try-finally语句
static String firstLineOfFile(String path, String defaultVal) {
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
return br.readLine();
} catch (
IOException e) {
return defaultVal;
}
}
- 让每个类或成员尽可能地不可访问。换句话说,使用尽可能低的访问级别,与你正在编写的软件的对应功能保持一致。
- 无论何时实现具有合理排序的值类,你都应该让该类实现 Comparable 接口,以便在基于比较的集合中轻松对其实例进行排序,搜索和使用。比较 compareTo 方法的实现中的字段值时,请避免使用「<」和「>」运算符。相反,使用包装类中的静态 compare 方法或 Comparator 接口中的构建方法。
- 谨慎的重写clone方法
- 通常,复制功能最好由构造方法或工厂提供。这个规则的一个明显的例外是数组,它最好用 clone 方法复制
- 公共类不应该暴露可变属性。公共类暴露不可变属性的危害虽然仍然存在问题,但其危害较小。然而,有时需要包级私有或私有内部类来暴露属性,无论此类是否是可变的
- 最小化可变性,不可变类比可变类更易于设计,实现和使用。他们不容易出错,并且更安全。
- 防止子类化,通常是通过 final 修饰类,但确保这个类不能被继承。
- 把所有字段设置为 final
- 把所有的字段设置为 private
- query comand 都设置为final?
- 组合优于继承。继承是强大的,但它是有问题的,因为它违反封装。只有在子类和父类之间存在真正的子类型关系时才适用。即使如此,如果子类与父类不在同一个包中,并且父类不是为继承而设计的,继承可能会导致脆弱性。为了避免这种脆弱性,使用组合和转发代替继承,特别是如果存在一个合适的接口来实现包装类。包装类不仅比子类更健壮,而且更强大。
精进自省:勿以善小而不为,勿以恶小而为之。