您的位置 首页 java

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学习笔记之四:通过私有构造器实现不可实例化

文章地址:https://www.zhihuclub.com/176721.shtml

关于作者: 智云科技

热门文章

网站地图