Effective Java学习笔记之四:通过私有构造器实现不可实例化

  • 解释

有时候,我们想写一个只包含静态方法和静态字段的类,这样的工具类不希望被实例化,因为实例化对它没有任何意义。然而,在缺少显式构造器的情况下,编译器会自动提供一个公有的、无参的缺省构造器,为了避免这种情况,让这个类包含一个私有构造器,它就不能被实例化:

//不可实例化工具类
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写工具类。

Effective Java学习笔记之四:通过私有构造器实现不可实例化

专业从事软件研发工作多年,在软件设计、开发、测试、研发管理等领域里经验丰富,感兴趣的朋友可以关注我的头条号,相信一定会有所收获。

如果有软件研发方面的问题,可以咨询我。

谢谢!


分享到:


相關文章: