偶尔情况下,你会编写只包含静态方法和静态域的类。这种类的名声不太好,因为有些人滥用他们来避免面向对象编程,不过这种类确实有他们的用处。
- 我们可以照java.lang.Math或java.util.Arrays的样子,用这种类将基本类型或数组上相关的方法组织起来;
public class Arrays {
public static void fill(long[] a, long val) {
...
}
}
- 还可以照jva.util.Collections的样子,将实现了特定接口的对象中的静态方法(包括静态工厂方法)组织起来;
public class Collections {
public static <T> boolean replaceAll(List<T> list, T oldVal, T newVal) {
...
}
}
- 最后,这种类可以用来将final类中的方法组织起来,以取代扩展该final类。
这种工具类设计出来并不是为了实例化它,工具类的实例是无意义的。然而,如果不显式地编写构造函数,编译器则会提供一个公共的无参数的默认构造方法。对用户来说,这种构造方法和其他构造函数没有任何区别。我们经常能在已发行的API中看到这种不经意的可实例化的类。
企图通过将类定义为抽象类来强制该类不可实例化,是不可行的。因为类可被子类化,而子类可以实例化。此外,这会误导用户一位这个类是设计来继承的(Item17)。然而,一种简单的习惯用法即可确保类不可实例化。只有当类中没有显式的构造函数,编译器才会生成默认构造函数,所以,只要类中包含私有构造函数即可保证不可实例化:
// Noninstantiable utility class
public class UtilityClass{
// Suppress default constructor for noninstantiability
private UtilityClass(){
throw new AssertionError();
}
}
由于显式的构造函数是私有的,所以在类的外部不可访问该方法。
AssertionError并不是必须的,不过它确保了该方法不会再类内部被意外调用,它确保了在任何情况下该类都不会被实例化。这种习惯用法有点违背直觉,因为明明已提供了构造函数,但却不能被调用。所以,聪明的做法是增加一条注释,如上例所示。
这种习惯用法的副作用是类不能被子类化了。子类的所有构造函数必须首先隐式或显式地调用父类构造函数,而在这种用法下,子类就没有可访问的父类构造函数可调用了。
分享到:
相关推荐
effective_java_new:Effective_java_new
只有当类不包含显式构造方法时,才会生成一个默认构造方法,因此可以通过包含一个私有构造方法来实现类的非实例化:// 不可实例化的程序类// 禁止默认构造函数以实现
目录:一、创建和销毁对象 (1 ~ 7)二、对于所有对象都通用的方法 (8 ~ 12)三、类和接口 (13 ~ 22)四、泛型 (23 ~ 29)五、枚举和注解 (30 ~ 37)六、方法 (38 ~ 44)七、通用程序设计 (45 ~ 56)八、异常 ...
只有当类不包含显式构造器时,才会生成一个默认构造器,因此可以通过包含一个私有构造器来实现类的非实例化:public class UtilityClass {..
《Effective Java》第三版中文版目录 第一章 介绍 1 第二章 创建和销毁对象 4 1 考虑用静态工厂方法替换构造器 4 2 当遇到多个构造器参
Joshua Bloch "Effective Java"
Effective SQL:编写高质量SQL语句的61个有效方法 AW.Effective.SQL.61.Specific.Ways.to.Write.Better.SQL.
effective_robotics_programming_with_ros配套例程代码
【Effective Java】阅读笔记markdown 文件
Effective C++:改善程序与设计的55个具体做法(中文第三版)亚马逊图书 放到Kindle上就可以浏览学习,因为亚马逊软件有防护功能,电脑上无法使用,切记!!!!
与构造函数不同,它们不需要在每次调用时都创建一个新对象 与构造函数不同,它们可以返回其返回类型的任何子类型的对象 它们减少了创建参数化类型实例的冗长 缺点 如果只提供静态工厂方法,则没有公共或受保护构造...
项)和不可实例化(第 3 项)保证 允许不可变值类保证不存在两个实例 形成模式的基础 枚举类型提供了这种保证 (PRO) 静态方法可以返回其返回类型的任何子类型的对象,与构造函数不同 这会导致 API 紧凑 适合基于接口...
经典 C++ 经验总结;Effective_C++__More_2nd_en;Effective_C++__More_2nd_en
" " " "___ " "Mgr:____________________" " " " "PMC " "_________ " " " " "Sup:___________________" "MIS " " " " "__________ " "Mgr:____________________" " " " "Shipping " "_________ " " " " "Sup:______...
effective-java.pdf
Item 4: Enforce noninstantiability with a private constructor Item 5: Prefer dependency injection to hardwiring resources Item 6: Avoid creating unnecessary objects Item 7: Eliminate obsolete object ...
Effective Java读书笔记.pdf
Effective java 3 学习记录
Effective JavaScript is organized around 68 proven approaches for writing better JavaScript, backed by concrete examples. You’ll learn how to choose the right programming style for each project, ...