私有构造方法为什么要抛异常?
私有构造方法为什么要抛异常?
不知道有没有小伙伴浏览过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出对象,这并非设计本意。现在应该懂了吧。如果确定类必须——不能被实例化。私有构造里也要抛异常哦~
1+1>2