2

シングルトンを次のように実装している間:

class MyConnection {
    private static MyConnection connection = new MyConnection();

    private MyConnection() {
    }

    public  static MyConnection getConnection() {
        return connection;
    }
}

1) なぜconnectionstatic として与えるのですか?

getConnection()これは静的であり、静的コンテキストで非静的を参照できないという事実だけによるものですか、それとも他の理由がありますか?

connection2) final として宣言する必要がありますか?

4

3 に答える 3

9

1) なぜconnectionstatic として与えるのですか?

それが非静的である場合MyConnection、参照を取得するためにのインスタンスが必要になりconnection、目的に反します。:)

getConnection()これは静的であり、静的コンテキストで非静的を参照できないという事実だけによるものですか、それとも他の理由がありますか?

はい。(getConnection()静的である必要があるため、静的であるconnection必要があります。)

2) 接続を最終として宣言する必要がありますか?

いいえ。ただし、一度初期化すると、変更しないでください。

ただし、代わりにan を使用することをお勧めします。enum

enum MyConnection {

    INSTANCE;

    // your methods...
}

からアクセスしますMyConnection.INSTANCE

経験則: クラスに事前定義された数のインスタンスが必要な場合は、enum. この場合、インスタンスの数は 1 です。

于 2012-07-13T10:38:12.840 に答える
1

1)接続を静的にするのはなぜですか?

シングルトンにしたいからです。静的メソッドを介してアクセスしていなくても、static variable by making it public and final. ただし、変数は静的でなければなりません。

2) 接続を最終として宣言する必要がありますか?

コードのように静的メソッドを介してアクセスしている場合は、変更するために外部に公開されないため、必要ありません。

ただし、シングルトン変数を public にすると、それも final でなければなりません。

于 2012-07-13T10:38:47.810 に答える
1

シングルトンは、インスタンスが 1 つしかないクラスです。Java でそのパターンを実装する最も一般的な方法は、privateコンストラクターを宣言して通常の初期化を防ぎpublic static、単一のインスタンスを提供するメソッドを宣言することです。(しかし、aioobeの列挙型の答えはクールです!)

静的メソッドは、クラスのインスタンスなしで呼び出すことができるため、次のようなことが可能になりますMySingleton.getInstance()。ただし、クラスのインスタンスがあることが保証されていないため、インスタンス変数にアクセスする方法はありません。変数をstatic「クラス変数」として宣言するように宣言することにより、静的メソッドと同じ方法で変数にアクセスできるようにし、静的メソッドがそれにアクセスできるようにします(繰り返しますが、静的メソッドは非静的変数にアクセスできません。それらが存在するという保証はなく、とにかくどのインスタンスを調べればよいかわかりません)。したがって、1) に答えるには、シングルトンのインスタンスを検索するためにシングルトンのインスタンスが必要な場合、キャッチ 22 が必要になるためです。

2) については、最終的であると宣言する必要はありませんが、最終的である可能性があるものは何でも宣言することをお勧めします。そうすれば、意図が明確になり、間違いを犯した場合にコンパイラが助けてくれます。少なくとも最終的または非公開にする必要があります。

于 2012-07-13T10:44:51.167 に答える