web-dev-qa-db-ja.com

プライベートクラスを静的にしたいのはいつですか?

一般的に、プライベートクラスを静的として宣言することには利点がありますか?

どのような場合に、次のいずれかを使用するのですか?

private static class Foo
{
    ...
}

private class Foo
{
    ...
}
56
His

これは良い出発点だと思います: http://Java67.blogspot.fi/2012/10/nested-class-Java-static-vs-non-static-inner.html

1)ネストされた静的クラスは外部クラスの参照を必要としませんが、非静的ネストクラスまたは内部クラスは外部クラス参照を必要とします。 Outerクラスのインスタンスを作成しないと、Innerクラスのインスタンスを作成できません。これは、ネストされたクラスを静的または非静的にする際に考慮する最も重要なことです。

2)静的クラスは実際にはクラスの静的メンバーであり、静的コンテキストで使用できます。静的メソッドまたは外部クラスの静的ブロック。

3)静的ネストクラスと非静的ネストクラスのもう1つの違いは、非静的メンバーにアクセスできないことです。メソッドとフィールドをネストされた静的クラスに直接入れます。使用すると、「静的コンテキストでは非静的メンバーを使用できません」などのエラーが発生します。内部クラスは、外部クラスの静的メンバーと非静的メンバーの両方にアクセスできます。

41
Esko Piirainen

囲んでいるクラスのメンバー変数/メソッドにアクセスする必要がある場合は、非静的フォームを使用します。そうでない場合は、静的フォームを使用します。

2
Jeff Storey

あなたは内部クラスを参照していると思います。

その動機は、あなたがあなたの内なるクラスをどのように結び付けたいかから来ていると思います。内部クラスを外部クラスの特定のインスタンスに関連付ける場合は、private classを使用します。それ以外の場合は、private static classを使用します。

1
Paul

汎用の抽象クラスに特定の例外がある場合に役立ちます。つまり:

public abstract class AbstractClass <T>
{
    private void doSomethingOrThrowException() throws SpecificException
    {
        ....

        if ( ! successful)
        {
            throw new SpecificException();
        }
    }

    private static class SpecificException extends Exception {}
}

静的を除外すると、コンパイラは次のようなエラーを表示します:The generic class AbstractClass<T>.SpecificException may not subclass Java.lang.Throwable

0
Deiwin