Java 如何使内部类不可实例化?

Java 如何使内部类不可实例化?,java,class,inner-classes,Java,Class,Inner Classes,我想要一个静态的内部类,它甚至不能被外部类实例化。现在我有一个文档说“请不要实例化这个对象”。我能发出更好的信号吗 我想要一个静态的内部类,它甚至不能被外部类实例化 我假设“外部类”实际上是指封闭类 如果不想限制封闭类,那么将内部类的唯一构造函数设置为private将达到预期效果 如果您还想限制封闭类,答案是没有办法做到这一点。如果将内部类构造函数声明为private,则封闭类仍然可以访问它并实例化它。如果将内部类声明为abstract,则封闭类仍然可以声明子类并实例化该类 然而,我认为这(

我想要一个静态的内部类,它甚至不能被外部类实例化。现在我有一个文档说“请不要实例化这个对象”。我能发出更好的信号吗

我想要一个静态的内部类,它甚至不能被外部类实例化

我假设“外部类”实际上是指封闭类

  • 如果不想限制封闭类,那么将内部类的唯一构造函数设置为private将达到预期效果

  • 如果您还想限制封闭类,答案是没有办法做到这一点。如果将内部类构造函数声明为
    private
    ,则封闭类仍然可以访问它并实例化它。如果将内部类声明为
    abstract
    ,则封闭类仍然可以声明子类并实例化该类

然而,我认为这(即防止内部类的所有实例化)是一个毫无意义的练习。内部类中的任何非静态声明都不能以任何方式使用,任何静态声明也可以在封闭类中声明

此外,通过编辑包含这两个类的源文件,可以避免“阻止”封闭类实例化内部类的任何操作。即使是带有
私有
构造函数的类也可以使用反射进行实例化,只要方法正确

我想要一个静态的内部类,它甚至不能被外部类实例化

我假设“外部类”实际上是指封闭类

  • 如果不想限制封闭类,那么将内部类的唯一构造函数设置为private将达到预期效果

  • 如果您还想限制封闭类,答案是没有办法做到这一点。如果将内部类构造函数声明为
    private
    ,则封闭类仍然可以访问它并实例化它。如果将内部类声明为
    abstract
    ,则封闭类仍然可以声明子类并实例化该类

然而,我认为这(即防止内部类的所有实例化)是一个毫无意义的练习。内部类中的任何非静态声明都不能以任何方式使用,任何静态声明也可以在封闭类中声明


此外,通过编辑包含这两个类的源文件,可以避免“阻止”封闭类实例化内部类的任何操作。即使是一个带有
私有
构造函数的类,也可以使用反射进行实例化,只要方法正确。

重新构造它并使其成为匿名类。

重新构造它并使其成为匿名类。

首先在单独的文件中创建以下内容:

public Do_Not_Instantiate_This_Class extends Exception {
    /*
    *Please Do Not Instantiate This Class
    */
    private static final long serialVersionUID = 1L;
}
然后,在内部类中创建一个

private final innerClass() throws Do_Not_Instantiate_This_Class {
    throw(new Do_Not_Instantiate_This_Class());
}

这样,除了外部类之外,没有其他类可以“看到”构造函数,并且外部类在没有try/catch或throws声明Do\u Not\u实例化\u这个类以便进行编译之前不能使用构造函数,并且它将始终在运行时捕获或抛出它。并非完全最优,但我认为它可以按您的要求完成。

首先在单独的文件中创建以下内容:

public Do_Not_Instantiate_This_Class extends Exception {
    /*
    *Please Do Not Instantiate This Class
    */
    private static final long serialVersionUID = 1L;
}
然后,在内部类中创建一个

private final innerClass() throws Do_Not_Instantiate_This_Class {
    throw(new Do_Not_Instantiate_This_Class());
}

这样,除了外部类之外,没有其他类可以“看到”构造函数,并且外部类在没有try/catch或throws声明Do\u Not\u实例化\u这个类以便进行编译之前不能使用构造函数,并且它将始终在运行时捕获或抛出它。并非完全最优,但我认为它可以按您的意愿完成。

您能解释一下为什么需要它吗?如果它不能被实例化,只有它的静态方法可以被使用,那么我就不能把它看作是一个内部类,而不仅仅是一个私有类。你能解释一下你为什么需要它吗?如果它不能被实例化,那么只有它的静态方法可以发挥任何作用,而且我也不能把它看作是一个内部类,而不仅仅是一个私有类。在你的私有构造函数中,你可以抛出一个新的AssertionError,消息是“不要实例化”这是一个运行时解决方案。OP需要一个编译时解决方案。在您的私有构造函数中,您可以抛出一个带有消息“don't instantiate”的新AssertionError,使您的愿望更加明确。这是一个运行时解决方案。OP需要一个编译时解决方案。我打赌这是您第一次看到代码包含行“new Do\u Not\u Instantiate\u This\u Class()”:)我打赌这是您第一次看到代码包含行“new Do\u Not\u Instantiate\u This\u Class()”:)