当前位置: 首页 > 知识库问答 >
问题:

Void真的不可实例化吗?

戚繁
2023-03-14

void的javadoc表示:

Void类是一个不可实例化的占位符类,用于保存对表示Java关键字Void的类对象的引用。

但构造函数只是:

private Void() {}

并且此代码实例化void:

Constructor<Void> c = Void.class.getDeclaredConstructor();
c.setAccessible(true);
Void v = c.newInstance(); // Hello sailor

是否有一种方法使void真正不可实例化?

共有1个答案

冀望
2023-03-14

使您的构造函数私有,并且没有任何其他可由外部访问的构造函数,会使类不可实例化。

但是,您无法避免使用反射API访问它。使用反射,你可以做,什么是不允许的,通常。

但是,如果您真的希望您的类是不可实例化的,即使是通过反射,您也可以抛出构造函数中的未检查异常。

private MyClass() {
    throw UnsupportedOperationException("Can't instantiate class");
}

在这种情况下,当您使用构造函数#newInstance()方法创建实例时,它将抛出一个InvocationTargetException,正如@Alex的注释中引用的那样。

下面是构造函数#newInstance()方法的文档,它声明了一个要抛出的异常列表,其中之一是InvocationTargetException,它说:-

抛出:
InvocationTargetException-如果基础构造函数抛出异常。

 类似资料:
  • 我已经开始使用Kotlin作为java的替代品,并且非常喜欢它。然而,如果不跳回java领域,我就无法找到解决方案: 我有一个

  • 我有一个没有扩展可串行化或可外部化接口的类,但在netbeans中使用FindBugs时仍然会遇到错误。有人能告诉我如何解决这个问题吗? 这是我的课 FindBug中的Bug:类分析器定义了一个非瞬时的非序列化实例字段objAnalyzerVar,对于objAnalyzerDataTypeInfo也是如此;

  • 问题内容: 我一直在学习如何使用。 我知道如果我创建一个具有不同变量的类“ A”来实现并添加到类中,那么它也是。 但是,实际上是谁在实现这两种方法进行序列化?是否一切或不同类的重载他们的照顾时,有必要吗? 问题答案: 序列化实际上是在(和java.io.ObjectInputStream)及其一些帮助器类中实现的。在许多情况下,这种内置支持就足够了,开发人员只需要实现marker接口。该接口称为“

  • 考虑以下代码: 现在扩展了一个实现接口的类。类和是带有一堆getter和setter的POJOS。FindBugs抱怨和字段说: 这个Serializable类定义了一个非基元实例字段,它既不是瞬态的、Serializable的,也不java.lang.Object的,并且似乎没有实现Externalizable接口或readObject()和WriteObject()方法。 好吧,所以一切都很好

  • 4.2.真实世界的例子 我们要做的是一个Twitter应用。用户的需求很清楚,那就是发新消息、查看朋友的新消息,这也正是它的基本功能。除此之外,我们还需要事先获知用户的用户名和密码才能登录Twitter。由此可知,我们需要三个界面。 其次,我们希望应用程序能够流畅地运行,而回避开网络连接情况的影响。应用程序应该只在设备联网时抓取Twitter消息,并缓存到本地。为此,我们需要用到一个后台运行的Se

  • 问题内容: 我需要这样做:将值更改侦听器更改为JTextField 我想Condemwnci的解决方案,但我得到的是错误的路线: 在我的情况是: 就我而言,我想更新Jtable中的行,所以我的方法将是这样的: 我在Linux ubuntu 11.10上使用Eclipse(如果有的话)。 编辑: 我不明白为什么,但是它可以通过以下方式工作: 然后改写Implements方法,而不是全部在同一行中完成