私有构造方法为什么要抛异常?

Posted novae

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了私有构造方法为什么要抛异常?相关的知识,希望对你有一定的参考价值。

私有构造方法为什么要抛异常?

不知道有没有小伙伴浏览过JDK源码,发现有些私有构造方法里也要抛出异常。那么疑问来了?构造方法都私有了。也不能调用,抛异常不是多此一举吗?

答案是否定的。

先来看一个例子:java.util.Objects

public final class Objects {
    private Objects() {
        throw new AssertionError("No java.util.Objects instances for you!");
    }
}

在源码里抛出了一个异常,No java.util.Objects instances for you!,意思就是不能提供给你这个对象的实例。

之所以要抛异常是因为反射。
反射可以修改方法的访问权限,调用方法。

package reflect;

import org.junit.Test;

import java.lang.reflect.Constructor;
import java.util.Objects;

public class ClassPrivate {
    @Test
    public void test() {
        try {
            Class<?> clazz = Class.forName("java.util.Objects");
            Constructor<?> constructor = clazz.getDeclaredConstructor();// 获取构造方法
            constructor.setAccessible(true); // 修改private权限。true表示可以访问私有方法
            Objects objects = (Objects) constructor.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行报如下错误。如果不在私有构造方法抛异常,那么该对象仍然能通过反射new出对象,这并非设计本意。现在应该懂了吧。如果确定类必须——不能被实例化。私有构造里也要抛异常哦~
技术图片

以上是关于私有构造方法为什么要抛异常?的主要内容,如果未能解决你的问题,请参考以下文章

由于 Fragment 类中没有公共构造函数方法,在 android 中旋转设备后出现异常

Java 求大神们解答:自定义异常,处理异常

自定义异常类:三角形的判断和面积

Java学习笔记3.10.3 异常处理 - 抛出异常

如果我不告诉 C++ 中要抛出啥类型的对象,会抛出啥 throw 语句?

面向对象