update : 4. 使用私有构造方法执行非实例化

This commit is contained in:
sjsdfg 2019-04-05 23:33:23 +08:00
parent 577142bec5
commit 14fdc5dee7

View File

@ -1,11 +1,11 @@
# 4. 使用私有构造方法执行非实例化 # 4. 使用私有构造方法执行非实例化
  偶尔你会想写一个类,它只是一组静态方法和静态属性。 这样的类获得了不好的名声,因为有些人滥用这些类而避免以面向对象方式思考,但是它们确实有着特殊的用途。 它们可以用来按照 `java.lang.Math``java.util.Arrays` 的方式,在基本类型的数值或数组上组织相关的方法。 它们也可以用于将静态方法(包括工厂(条目 1分组用于实现某个接口的对象其方式为 `java.util.Collections`。 (从 Java 8 开始,你也可以将这些方法放在接口中,假如它是你自己修改的。)最后,这样的类可以用于在 final 类上对方法进行分组,因为不能将它们放在子类中。   偶尔你会想写一个只包含静态方法和静态属性的类。 这样的类获得了不好的名声,因为有些人滥用这些类而避免以面向对象方式思考,但是它们确实有着特殊的用途。 它们可以用来按照 `java.lang.Math``java.util.Arrays` 的方式,把基本类型的值或数组类型上的相关方法组织起来。我们也可以通过 `java.util.Collections` 的方式,把实现特定接口上面的静态方法进行分组,也包括工厂方法(条目 1。 (从 Java 8 开始,你也可以将这些方法放在接口中,假定是你编写的接口并可以进行修改。)最后,这样的类可以用于在 final 类上对方法进行分组,因为不能将它们放在子类中。
  这样的实用类utility classes不是设计用来被实例化的一个实例是没有意义的。然而在没有显式构造方法的情况下编译器提供了一个公共的、无参的默认构造方法。对于用户来说该构造方法与其他构造方法没有什么区别。在已发布的 API 中经常看到无意识的被实例的类。   这样的实用类utility classes不是设计用来被实例化的一个实例是没有意义的。然而在没有显式构造方法的情况下编译器提供了一个公共的、无参的默认构造方法。对于用户来说该构造方法与其他构造方法没有什么区别。在已发布的 API 中经常看到无意识的被实例的类。
  **试图通过创建抽象类来强制执行非实例化是行不通的。** 该类可以被子类化,子类可以被实例化。此外,它误导用户认为该类是为继承而设计的 (条目 19)。不过,有一个简单的方法来确保非实例化。只有当类不包含显式构造方法时,才会生成一个默认构造方法,**因此可以通过包含一个私有构造方法来实现类的非实例化:**   **试图通过创建抽象类来强制执行非实例化是行不通的。** 该类可以被子类化,子类可以被实例化。此外,它误导用户认为该类是为继承而设计的(条目 19。不过,有一个简单的方法来确保非实例化。只有当类不包含显式构造方法时,才会生成一个默认构造方法,**因此可以通过包含一个私有构造方法来实现类的非实例化:**
```java ```java
// Noninstantiable utility class // Noninstantiable utility class