项目实训(七)effective java 读书笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhang___yong/article/details/81181119

1.单个enum类型成为单例模式的绝佳实现,他支持序列化并绝对防止多次实例化。

2.尽量使用基本类型而非装箱基本类型,避免多次创建装箱实例造成的浪费。

3.在重写equals的时候要先使用instanceOf进行类型检查,所以不需要进行判空。可以在最开始时先使用开销比较低的==进行判断。不要提供非object类型的重载。

4.将类设置为不可变是有必要的,线程安全,不易出错。

5.所有基本类型的包装类都提供了静态工厂方法,以复用现有实例。静态工厂方法可以通过方法名清晰的传递出构建方式。除了使用final防止类被扩展外,也可以使用私有构造器加静态工厂方法的方式,更加灵活。

6.为了避免多步骤操作中频繁创建string实例,所以提供了配套类StringBuilder。

7.在为了继承而设计的类中决不能在构造器中调用可被覆盖的方法。因为父类构造器总在子类构造器前调用,如果子类覆盖的方法依赖子类构造器的初始化过程,那么就会出错。

8.用于存储常量的接口是一种错误的使用,他的实现类命名空间会被污染。这些全局变量可以存在不可被实例化的工具类中,如果不想通过类名使用的话可以静态导入:import static xxx.*;

9.当一个具体的策略实现类只使用一次的时候就匿名实现,否则可以创建实现类。

10.非静态内部类持有外部类引用(必须用外部类实例来实例化),可以通过外部类类名.this获取外部类实例引用,也可以直接调用外部类实例方法。静态内部类则没有外部类依赖。

11.包内可见的包是那个package声明。

12.泛型都对应着原型,如List<E>对应着List。原型的保留仅仅是为了兼容,不应再新代码中使用。List<String>是List的子类,但不是List<Object>的子类。可以用List<?>表示某种还不知道类型的集合,但是这种声明的实例不能放入除了Null外的任何元素,只是用来表示使用泛型,这也是为了保护不破坏泛型约束。在类字面常量和instanceof使用时不能使用泛型,只能List.class。

13.而数组则支持认为Son[]是Father[]的子类,因此数组容易导致类型错误,且不支持泛型数组。

14.泛型中<? extends A><? super A>,extends是指本类及所有子类,不能往里放东西,set失效,因为编译器不知道存放的具体类型,但可以取出A类的元素。super表示本类和所有基类,可以往里放A类及其子类元素(也就是向下的粒度,这样不管存的什么都是正确的),取出来的只能是Object类型的,原因同上。A可以是接口。

猜你喜欢

转载自blog.csdn.net/zhang___yong/article/details/81181119
今日推荐