0%

Effective Java 笔记二

类和接口

使类和成员的可访问性最小化

1、尽可能地使每个类或者成员不被外界访问。换句话说,应该使用与你正在编写的软件的对应功能相一致的、尽可能最小的访问级别。例如,想在实体类的中,使用private定义属性值。

在公有类中使用访问方法而非公有域

使可变性最小化

不要提供任何会修改对象状态的方法(也称为 mutator)

保证类不会被扩展。

这样可以防止粗心或者恶意的子类假装对象的状态已经改变,从而破坏该类的不可变行为。为了防止子类化,一般做法是使这个类成为 final的,但是后面我们还会讨论到其他的做法。

使所有的域都是final的。

通过系统的强制方式,这可以清楚地表明你的意图。而且,如果一个指向新创建实例的引用在缺乏同步机制的情况下,从一个线程被传递到另一个线程,就必需确保正确的行为,正如内存模型( memory model)中所述。

使所有的域都成为私有的。

这样可以防止客户端获得访问被域引用的可变对象的权限,并防止客户端直接修改这些对象。虽然从技术上讲,允许不可变的类具有公有的 final域,只要这些域包含基本类型的值或者指向不可变对象的引1用,但是不建议这样做,因为这样会使得在以后的版本中无法再改变内部的表示法(见第13条)。

确保对于任何可变组件的互斥访问。

如果类具有指向可变对象的域,则必须确保该类的客户端无法获得指向这些对象的引用。并且,永远不要用客户端提供的对象引用来初始化这样的域,也不要从任何访问方法( accessor)中返回该对象引用。在构造器、访问方法和readobject方法(见第76条)中请使用保护性拷贝( defensive copy)技术(见第39条)。

复合优先于继承

不要出现跨包继承。

要么为继承而设计,并提供文档说明,要么就禁止继承

接口优于抽象类

通过 implements 来实现接口,可以多实现。

接口只用于定义类型

类层次优于标签类

用函数对象表示策略

优先考虑静态成员类

泛型

请不要在新代码中使用原生态类型

每个泛型都定义一个原生态类型(raw type),即不带任何实际类型参数的泛型名称。例如,与List相对应的原生态类型是List。原生态类型就像从类型声明中删除了所有泛型信息一样。实际上,原生态类型List与Java平台没有泛型之前的接口类型List完全一样。

1
2
3
List<Integer> list = new ArrayList<>();
Object o = new Object();
list.add(o);//这里会报错

消除非受检警告

尽可能的消除代码中的警告信息。如果无法消除警告,同时可以证明引起警告的代码是类型安全的,(只有在这种情况下才)可以用一个@ SuppressWarnings(“unchecked”)注解来禁止这条警告。

列表优先于数组

优先考虑泛型

优先考虑泛型方法

利用有限制通配符来提升AP的灵活性

优先考虑类型安全的异构容器

枚举和注解

用enum代替int常量

很多常亮不需要定义一大推,只需要使用枚举,定义一个就好了。

用 EnumSet代替位域

用接口模拟可伸缩的枚举

用标记接囗定义类型

标记接口胜过标记注解的另一个优点是,它们可以被更加精确地进行锁定。如果注解类型利用@Target( ElementType.TYPE)声明,它就可以被应用到任何类或者接口。假设有一个标记只适用于特殊接口的实现。如果将它定义成一个标记接口,就可以用它将唯一的接口扩展成它适用的接口。

客官,赏一杯coffee嘛~~~~