effective java 第一天

1.考虑用静态工厂方法替代构造器

eg:https://blog.csdn.net/zhangshaoqiangchn/article/details/65442234

服务接口:服务所需完成的工作

服务实现类

服务者接口:服务者需完成的工作

服务者实现类

注册API:Manager.regist()

获得服务API:服务提供者.get服务()

2.遇到多个构造器时要使用构建器

https://www.cnblogs.com/lwbqqyumidi/p/3742562.html

重叠构造器模式:多个构造器,但是这样很麻烦

javabean模式:使用getter和setter来设置值。为构造过程被分到了几个调用中,在构造过程中JavaBean可能处于不一致的状态。类无法仅仅通过检验构造器参数的有效性来保证一致性。

builder模式:

1.这样可以很清晰地设置域的值。(模拟具名的可选参数)

2.在build()方法中还可以检验参数

Builder模式与传统的模式相比,并不是完全胜出的,相比之下,Builder模式的代码量会比正常多不少,但是随之带来的好处是代码的可读性和可维护性。但是,往往一个好的设计模式或架构,就是在牺牲某一种能力从而大大增强另一种能力,例如,牺牲一定的可读性,增加项目的可扩展性等等这样的方式。因此,在参数较为复杂,构造对象相对繁琐的情况下,一定要首先考虑使用Builder模式。

3.用私有构造器或者枚举类型强化Singleton属性

创造Singleton的几种方法:

1.

2.静态工厂方法

如果要设置他为可序列化的类,那么不仅仅要implements Serializable,还必须把实例域标注上transient,并提供一个readResolve方法。

readResolve方法:当JVM从内存中反序列化地"组装"一个新对象时,就会自动调用这个 readResolve方法来返回我们指定好的对象了, 单例规则也就得到了保证.

3.单元素枚举(无偿提供序列化机制,绝对防止多次实例化)自动内置private构造器:代码简单,自动序列化。

4.通过私有构造器强化不可实例化的能力

对于一些只包含静态方法和静态域的类,实例化是没有意义的,但是我们不写它的构造器,系统会默认生成一个缺省构造器,这会导致无意义的实例化。

然而,如果我们为了不让他实例化而把他声明成一个abstract类,这会误导用户,认为这是一个专门为了被继承才写的类。

所以,可以采用private构造器来防止实例化,在源码中可以用注释类说明。但是这么做了之后,就无法生成子类了。因为所有构造器都必须显示或隐式地调用父类的构造器。

5.避免创建不必要的对象

(1)使用String时

String s = new String("string");  创建2个实例

String s = "string" 创建一个实例,并且可以保证,在同一JVM中,只要包含相同的字符串常量,该对象就会被重用。

(2)那些只用实例化一次的

(3)自动装箱

把long打错成Long,其速度就会慢得多:要优先使用基本类型而不是装箱类型。

6.消除过期的对象引用(不太懂)

自己管理内存的的类,需要警惕其内存泄漏问题:比如Stack,要手动将stack[size]=null;

缓存导致的内存泄漏

监听器和其他回调导致的内存泄漏

猜你喜欢

转载自blog.csdn.net/weixin_38967434/article/details/82700359