9

コンストラクターをプライベートにすることで、クラスのオブジェクトの作成を制限できます。ただし、このコンストラクターはクラス内から呼び出すことができます。Javaでこれを防ぐ方法はありますか?

ありがとう。

4

6 に答える 6

14

いいえ、これを行うクリーンな方法はありません。そして、本当にそうする理由がわかりません。コンストラクターがプライベートである場合、これは、この正確なクラス内のコードからのみ呼び出すことができることを意味するため (サブクラスやパッケージ内の他のクラスはありません)、コンストラクターを呼び出したくない場合は、コメントを付けてください。そう言う。

コンストラクターを使用できる人は誰でも、コンストラクターの呼び出しを防ぐためにそこに配置した対策を削除できるため、実際の効果はありません。

さらに、シングルトンが必要な場合は、コンストラクターを少なくとも 1 回実行する必要がある場合があります (シングルトンのアイデアが純粋な静的クラスである場合を除く)。

于 2010-05-23T19:09:06.170 に答える
9

プライベートで、独自のクラス内で呼び出されたくない場合は、そのようなことを防ぐ簡単な方法があります。それを呼び出すコードを複数回記述しないでください。あなたはクラスの作者です。なぜあなたはあなた自身があなたのコントロールの範囲内で何かをするのを防ぐためにコードを書くのですか?

振り返りに頼らずにクラスの外で呼び出すことはできません。クラス内で複数回呼び出されたくない場合は、呼び出さないでください。実行しないことを選択できるアクションを防ぐためのコードを書くのはなぜですか?

確認してみましょう:

コンストラクターをプライベートにすることで、クラスのオブジェクトの作成を制限できます。

コンストラクターはプライベートであるため、クライアントがリフレクションAPIを使用してアクセス制限を弱体化させない限り、クラスの外部で呼び出すことはできません。

ただし、このコンストラクターはクラスから呼び出すことができます。Javaでこれを防ぐ方法はありますか?

OPは、クラス内で制限付きコンストラクターを呼び出さないように要求しています。

これらの2つのステートメントが正しい場合は、コンストラクターの呼び出しを防ぐロジックが必要な理由を説明してください。

プライベートコンストラクターの一般的な使用法は次のとおりです。

public class Singleton
{
    private static final Singleton instance = new Singleton();

    public static void main(String[] args)
    {
        Singleton singleton = Singleton.getInstance();

        System.out.println(singleton);
    }

    private Singleton() {};

    public static Singleton getInstance() { return Singleton.instance; }

    public String toString() { return Singleton.class.getName(); }
}

プライベートコンストラクターの呼び出しを禁止する意味がわかりません。

于 2010-05-23T19:11:51.863 に答える
6

公式の答えはノーです。誰かがあなたのクラスへのプライベート アクセスを取得できる場合、そのクラスをインスタンス化できます。

ただし、これを行うことができます:

private static int count = 0;

private MyClass(){
    if(++count>1)throw new IllegalStateException(); //allow exactly one instantiation
}
于 2010-05-23T19:09:47.107 に答える
3

いいえ、特定の型の単一のインスタンスを強制する方法はありません。あなたが説明したように、最も近いのは、コンストラクターをプライベートにして、そのクラス内の関数だけがそれを呼び出すことができるようにすることです。実行時に何かを行うことはできますが (静的インスタンスが既に存在する場合に例外をスローするなど)、コンパイル時には何も得られません。

于 2010-05-23T19:07:41.567 に答える
2

シングルトンを作成している場合は、列挙型が最適な方法です。

public enum MySingleton {
    INSTANCE;
    // add methods & stuff here
}

// Usage:
MySingleton.INSTANCE.doSomething();

「単一性」は JVM によって保証されます。インスタンスは 1 つだけです。

于 2010-05-23T20:43:20.580 に答える