的javadocVoid
说:
Void类是一个无法实例化的占位符类,用于保存对表示Java关键字void的Class对象的引用。
但是构造函数很简单:
private Void() {}
这段代码实例化了Void
:
Constructor<Void> c = Void.class.getDeclaredConstructor();
c.setAccessible(true);
Void v = c.newInstance(); // Hello sailor
所以Void
是 不是 不可实例。
是否有办法使Void
真正无法实例化?
将构造函数设为私有,并且没有外部可以访问的任何其他构造函数,会使类 无法实例化 。
但是,您无法避免使用来访问它Reflection API
。使用反射,您可以执行通常不允许的操作。
但是,如果你真的想你的类是 不可实例 ,甚至通过 反射 ,你可以throw
一个 未经检查的异常 从 构造函数 。
private MyClass() {
throw UnsupportedOperationException("Can't instantiate class");
}
在这种情况下,使用Constructor#newInstance()
方法创建实例时,它将抛出一个InvocationTargetException
@注释中引用的。
这是Constructor#newInstance()
method
的文档,它声明要抛出的异常列表,其中一个是InvocationTargetException
,它说:-
throws:
InvocationTargetException-如果基础构造函数抛出异常。
问题内容: 我并不是要求个人对这一哲学有“宗教”的看法,而是一些更专业的观点。 我理解这句话是几个试金石之一,看看你的代码是否是“pythonic”。但对我来说,pythonic意味着干净、简单和直观,没有为错误的代码加载异常处理程序。 所以,实际的例子。我定义一个类: 现在,从程序背景来看,在另一个函数中,我想这样做: 如果我不耐烦并且没有执行初始foo=None,我将得到一个属性异常。所以,“
的javadoc表示: Void类是一个不可实例化的占位符类,用于保存对表示Java关键字Void的类对象的引用。 但构造函数只是: 并且此代码实例化: 是否有一种方法使真正不可实例化?
问题内容: 我们都知道这String在Java 中是不可变的,但是请检查以下代码: 为什么该程序会这样运行?为何值和改变了,但没有改变? 问题答案: 是不可变的*,但这仅意味着你无法使用其公共API对其进行更改。 你在这里所做的是使用反射来绕过常规API。同样,你可以更改枚举的值,更改整数自动装箱中使用的查找表等。 现在,原因s1和s2变化值是它们都引用相同的实习字符串。编译器执行此操作(如其他答
某些键的虚拟键代码,如shift, [ , ],Del等,在java中显示为与C不同的值 /C.例如: 这是什么原因?这些代码是虚拟代码还是不同的类型?对于包括字母、数字在内的键,功能键(F1-F12)、退格、'等是相同的。 我可能误解了一个概念,在这种情况下,请澄清。 在C/C中登记 签入Java Ref:KeyEvent类
问题内容: 我已经使用番石榴已有一段时间了,并且对此感到非常信任,直到昨天我偶然发现了一个例子,这让我开始思考。长话短说,这里是: 运行此命令后,您可以看到 ImmutableList 内部的条目的值已更改。如果此处涉及两个线程,则一个线程可能碰巧看不到另一个线程的更新。 同样令我非常不耐烦的是,Effective Java中的Item15,第5点说: 在构造函数中制作防御程序副本 -看起来很合理
我们都知道在Java中是不可变的,但是检查下面的代码: 为什么这个程序会这样操作?为什么和的值被更改了,而却没有被更改?