Effective Java -- 通过私有构造器强化不可实例化的能力

本文是 《Effective Java Second Edition》第4条的读书笔记,文中如有错误或表述不当,非常欢迎能批评指正,本人不胜感激!


在绝大多数的项目中,我们都会用到一些工具类来供我们调用。如果获取六位数的验证码,或者进行对字符串的一些加密等等。

对于上面的这些工具类(Utils)我们不希望他们被实例化,因为实例化对它没有任何的意义。

但是在我们不添加构造函数的时候,编译器会自动的去添加一个公有地,无参的默认构造函数(default constructior)。

那么我们将这个类做成抽象类怎么样?
我们知道抽象类的作用就是专门被用来的继承了,一方面被继承了,其子类就会被实例化,另一方面,我们的工具类又不是用来继承的,这样反而会误导用户。

所以,这时候我们只要给这个类提供一个私有的构造函数就可以了。

/**
 * 字符串加密的工具类.
 *
 * @author 未绪~.
 * @date 2017/11/1-20:33.
 */
public class Md5Utils {

    //提供一个私有构造函数来防止该类被实例化

    private Md5Utils(){
        //防止不小心在类的内部调用,或者使用反射机制调用
        throw new AssertionError();
    }

}

我们需要给该构造函数加上一个注释,来表明其目的是为了防止被实例化。
我们可以在该私有构造函数中抛出一个异常,以防止我们在类的内部不小心调用。

这样的话该类既不能被实例化,也不能被继承了。

[注]. 子类的构造函数必须显示或者隐式的调用父类的构造函数,如果父类为私有的,则子类就没有权限访问了。


以上 2017/11/01-20:37 于福州大学.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值