编写高效优雅安全Java程序的常见原则
面向对象
- 构造器参数太多怎么办?
- 不需要实例化的类应该构造器私有
- 不要创建不必要的对象
- 避免使用终结方法
- 使类和成员的可访问性最小化
- 使可变性最小化
- 优先使用复合
- 接口优于抽象类
方法
- 可变参数要谨慎使用
- 返回零长度的数组或集合,不要返回null
- 优先使用标准的异常
- 通用程序设计
- 用枚举代替int 常量
- 将局部变量的作用域最小化
- 精确计算,避免使用float 和double
- 当心字符串连接的性能
构造器参数太多怎么办?
面向对象
用builder模式,用在
1、5个或者5个以上的成员变量
2、参数不多,但是在未来,参数会增加
Builder模式:
属于对象的创建模式,一般有
1、 抽象建造者:一般来说是个接口,包含
1)建造方法,建造部件的方法(不止一个),
2)返回产品的方法
2、 具体建造者
3、 导演者,调用具体的建造者,创建产品对象
4、 产品,需要建造的复杂对象
对于客户端,创建导演者和具体建造者,并把具体建造者交给导演者,然后由客户端通知导演者操纵建造者进行产品的创建。
在实际的应用过程中,有时会省略抽象建造者和导演者。
不需要实例化的类应该构造器私有
如,一些工具类提供的都是静态方法,这些类是不应该提供具体的实例的。可以参考JDK中的Arrays。
不要创建不必要的对象
1、 避免无意中创建的对象,如自动装箱
2、 可以在类的多个实例之间重用的成员变量,尽量使用static。
但是,要记住,是不要创建不必要的对象,而不是不要创建对象。
对象池要谨慎使用,除非创建的对象是非常昂贵的操作,如数据库的连接,巨型对象等等。
避免使用终结方法
finalizer方法,jdk不能保证何时执行,也不能保证一定会执行。如果有确实要释放的资源应该用try/finally。
使类和成员的可访问性最小化
编写程序和设计架构,最重要的目标之一就是模块之间的解耦。使类和成员的可访问性最小化无疑是有效的途径之一。
使可变性最小化
尽量使类不可变,不可变的类比可变的类更加易于设计、实现和使用,而且更不容易出错,更安全。
常用的手段:
不提供任何可以修改对象状态的方法;
使所有的域都是final的。
使所有的域都是私有的。
使用写时复制机制。带来的问题:会导致系统产生大量的对象,而且性能有一定的影响,需要在使用过程中小心权衡。
复合优先于继承
继承容易破坏封装性,而且会使子类的实现依赖于父类。
复合则是在类中增加一个私有域,引用类的一个实例,这样的话就避免了依赖类的具体实现。
只有在子类确实是父类的一个子类型时,才比较适合用继承。
接口优于抽象类