Skip to main content

Recently Updated Pages

39. 注解优于命名模式

Effective Java 第六章 枚举和注解

  过去,通常使用命名模式(naming patterns)来指示某些程序元素需要通过工具或框架进行特殊处理。 例如,在第 4 版之前,JUnit 测试框架要求其用户通过以 test[Beck0...

Updated 3 years ago by wandersky

38. 使用接口模拟可扩展的枚举

Effective Java 第六章 枚举和注解

  在几乎所有方面,枚举类型都优于本书第一版中描述的类型安全模式[Bloch01]。 从表面上看,一个例外涉及可扩展性,这在原始模式下是可能的,但不受语言结构支持。 换句话说,使用该模式,有可能...

Updated 3 years ago by wandersky

37. 使用 EnumMap 替代序数索引

Effective Java 第六章 枚举和注解

  有时可能会看到使用 ordinal 方法(详见第 35 条)来索引到数组或列表的代码。 例如,考虑一下这个简单的类来代表一种植物: class Plant { enum LifeCy...

Updated 3 years ago by wandersky

36. 使用 EnumSet 替代位属性

Effective Java 第六章 枚举和注解

  如果枚举类型的元素主要用于集合中,则传统上使用 int 枚举模式(详见第 34 条),将 2 的不同次幂赋值给每个常量: // Bit field enumeration constants...

Updated 3 years ago by wandersky

35. 使用实例属性替代序数

Effective Java 第六章 枚举和注解

  许多枚举通常与单个 int 值关联。所有枚举都有一个 ordinal 方法,它返回每个枚举常量类型的数值位置。你可能想从序数中派生一个关联的 int 值: // Abuse of ordin...

Updated 3 years ago by wandersky

34. 使用枚举类型替代整型常量

Effective Java 第六章 枚举和注解

  枚举是其合法值由一组固定的常量组成的一种类型,例如一年中的季节,太阳系中的行星或一副扑克牌中的花色。 在将枚举类型添加到该语言之前,表示枚举类型的常见模式是声明一组名为 int 的常量,每个...

Updated 3 years ago by wandersky

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

Effective Java 第五章 泛型

  泛型的常见用法包括集合,如 Set<E> 和 Map<K,V> 和单个元素容器,如 ThreadLocal<T> 和 AtomicReference<T>。 在所有这些用途中,它都是参数化的...

Updated 3 years ago by wandersky

32. 合理地结合泛型和可变参数

Effective Java 第五章 泛型

  在 Java 5 中,可变参数方法(详见第 53 条)和泛型都被添加到平台中,所以你可能希望它们能够正常交互; 可悲的是,他们并没有。 可变参数的目的是允许客户端将一个可变数量的参数传递给一...

Updated 3 years ago by wandersky

31. 使用限定通配符来增加 API 的灵活性

Effective Java 第五章 泛型

  如条目 28 所述,参数化类型是不变的。换句话说,对于任何两个不同类型的 Type1 和 Type2,List<Type1> 既不是 List<Type2> 的子类型也不是其父类型。尽管 L...

Updated 3 years ago by wandersky

30. 优先使用泛型方法

Effective Java 第五章 泛型

  正如类可以是泛型的,方法也可以是泛型的。 对参数化类型进行操作的静态工具方法通常都是泛型的。 集合中的所有“算法”方法(如 binarySearch 和 sort)都是泛型的。   编写泛型...

Updated 3 years ago by wandersky

29. 优先考虑泛型

Effective Java 第五章 泛型

  参数化声明并使用 JDK 提供的泛型类型和方法通常不会太困难。 但编写自己的泛型类型有点困难,但值得努力学习。   考虑条目 7 中的简单堆栈实现: // Object-based coll...

Updated 3 years ago by wandersky

28. 列表优于数组

Effective Java 第五章 泛型

  数组在两个重要方面与泛型不同。 首先,数组是协变的(covariant)。 这个吓人的单词意味着如果 Sub 是 Super 的子类型,则数组类型 Sub[] 是数组类型 Super[] 的...

Updated 3 years ago by wandersky

27. 消除非检查警告

Effective Java 第五章 泛型

  使用泛型编程时,会看到许多编译器警告:未经检查的强制转换警告,未经检查的方法调用警告,未经检查的参数化可变长度类型警告以及未经检查的转换警告。 你使用泛型获得的经验越多,获得的警告越少,但不...

Updated 3 years ago by wandersky

26. 不要使用原始类型

Effective Java 第五章 泛型

  首先,有几个术语。一个类或接口,它的声明有一个或多个类型参数(type parameters ),被称之为泛型类或泛型接口[JLS,8.1.2,9.1.2]。 例如,List 接口具有单个类...

Updated 3 years ago by wandersky

25. 将源文件限制为单个顶级类

Effective Java 第四章 类和接口

  虽然 Java 编译器允许在单个源文件中定义多个顶级类,但这样做没有任何好处,并且存在重大风险。 风险源于在源文件中定义多个顶级类使得为类提供多个定义成为可能。 使用哪个定义会受到源文件传递...

Updated 3 years ago by wandersky

24. 支持使用静态成员类而不是非静态类

Effective Java 第四章 类和接口

  嵌套类(nested class)是在另一个类中定义的类。 嵌套类应该只存在于其宿主类(enclosing class)中。 如果一个嵌套类在其他一些情况下是有用的,那么它应该是一个顶级类。...

Updated 3 years ago by wandersky

23. 类层次结构优于标签类

Effective Java 第四章 类和接口

  有时你可能会碰到一个类,它的实例有两个或更多的风格,并且包含一个标签字段(tag field),表示实例的风格。 例如,考虑这个类,它可以表示一个圆形或矩形: // Tagged class...

Updated 3 years ago by wandersky

22. 接口仅用来定义类型

Effective Java 第四章 类和接口

  当类实现接口时,该接口作为一种类型(type),可以用来引用类的实例。因此,一个类实现了一个接口,因此表明客户端可以如何处理类的实例。为其他目的定义接口是不合适的。   一种失败的接口就是所...

Updated 3 years ago by wandersky

21. 为后代设计接口

Effective Java 第四章 类和接口

  在 Java 8 之前,不可能在不破坏现有实现的情况下为接口添加方法。 如果向接口添加了一个新方法,现有的实现通常会缺少该方法,从而导致编译时错误。 在 Java 8 中,添加了默认方法(d...

Updated 3 years ago by wandersky

20. 接口优于抽象类

Effective Java 第四章 类和接口

  Java 有两种机制来定义允许多个实现的类型:接口和抽象类。 由于在 Java 8 [JLS 9.4.3] 中引入了接口的默认方法(default methods ),因此这两种机制都允许为...

Updated 3 years ago by wandersky