1

外部クラスでもインスタンス化できない静的内部クラスが必要です。現在、「このオブジェクトをインスタンス化しないでください」というドキュメントがあります。より良い信号を出すことはできますか?

4

3 に答える 3

8

外部クラスでもインスタンス化できない静的内部クラスが必要です。

「外部クラス」とは、実際にはそれを囲むクラスを意味すると思います。

  • 囲んでいるクラスを制限したくない場合は、内部クラスの唯一のコンストラクターを作成するprivateと、目的の効果が得られます。

  • 囲んでいるクラスも制限したい場合、答えはこれを行う方法がないということです。内部クラスコンストラクターをとして宣言した場合でもprivate、それを囲むクラスはそれにアクセスしてインスタンス化できます。内部クラスをとして宣言した場合でもabstract、それを囲むクラスはサブクラスを宣言し、そのクラスをインスタンス化できます。

ただし、これ(つまり、内部クラスのすべてのインスタンス化を防ぐこと)は無意味な演習であることをお勧めします。内部クラスの非静的宣言はどのような方法でも使用できません。また、静的宣言は、それを囲むクラスで宣言することもできます。

さらに、2つのクラスを含むソースファイルを編集することで、囲んでいるクラスが内部クラスをインスタンス化するのを「防ぐ」ために行うことはすべて回避できます。また、コンストラクターを使用するクラスでもprivate、正しい方法で実行すれば、リフレクションを使用してインスタンス化できます。

于 2010-05-02T02:28:37.753 に答える
0

それを再構築し、匿名クラスにします。

于 2010-05-02T02:30:16.053 に答える
0

まず、別のファイルに以下を作成します。

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());
}

そうすれば、外部クラス以外のクラスはコンストラクターを「見る」ことができず、外部クラスは、コンパイルするためにDo_Not_Instantiate_This_Classのtry / catchまたはthrows宣言がないとコンストラクターを使用できず、常にそれをキャッチまたはスローします。実行時に。完全に最適というわけではありませんが、やりたいことができると思います。

于 2013-12-22T04:31:55.687 に答える