- 解释
有时候,我们想写一个只包含静态方法和静态字段的类,这样的工具类不希望被实例化,因为实例化对它没有任何意义。然而,在缺少显式 构造器 的情况下,编译器会自动提供一个公有的、无参的缺省构造器,为了避免这种情况,让这个类包含一个私有构造器,它就不能被实例化:
//不可实例化工具类 public class Rule4 { //禁止默认构造函数以实现不可实例化 private Rule4() { //避免不小心在类的内部调用构造器 throw new AssertionError(); } }
- 优点1:简单
尝试通过 抽象类 来强制执行非实例化不起作用。 该类可以是子类,子类可以实例化。这样做甚至会误导用户,以为这种类是专门为了继承而设计的。
- 缺点1:不能被继承
它使得一个类不能被子类化,因为子类必须显式或隐式地调用超类构造器。
- 最佳实践
使用Spring框架时,工具类也不建议通过Spring进行注入,所以,这种规则还是很有意义的,推荐使用,通常工具类我们会用final修饰类,这是为了保证类的数据的不可变,所以一个完善的工具类应该如下定义:
public final class Rule4 { //禁止默认构造函数以实现不可实例化 private Rule4() { //避免不小心在类的内部调用构造器 throw new AssertionError(); } }
Java8提供了在接口类中定义静态类的方法,同样不可实例化,而且,接口类中的成员变量都是final的,实现更加简洁:
public interface Rule41 { public static void test() { System.out.println("Rule41.test..."); } }
在Java8以后,建议都通过interface写工具类。