偶尔情况下,你会编写只包含静态方法和静态域的类。这种类的名声不太好,因为有些人滥用他们来避免面向对象编程,不过这种类确实有他们的用处。
- 我们可以照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:______...
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, ...
Effective-Java:Effective Java的所有练习程序