Подтвердить что ты не робот

Когда я хочу сделать свой приватный класс статическим?

В целом, есть ли преимущества в объявлении частного класса как статического?

В каких случаях я хотел бы использовать одно из следующего над другим?

private static class Foo
{
    ...
}

против

private class Foo
{
    ...
}
4b9b3361

Ответ 1

Я думаю, что это хорошая отправная точка:  http://java67.blogspot.fi/2012/10/nested-class-java-static-vs-non-static-inner.html

1) Вложенный статический класс не нуждается в ссылке класса Outer, но не статический вложенный класс или класс Inner требует ссылки на внешний класс. Вы не может создать экземпляр класса Inner без создания экземпляра Внешний класс. Это, безусловно, самое важное, делая вложенный класс статическим или нестатическим.

2) статический класс на самом деле является статическим членом класса и может использоваться в статический контекст, например. статический метод или статический блок класса Outer.

3) Еще одно отличие статического и нестатического вложенного класса что вы не можете получить доступ к нестационарным элементам, например. метода и поля в вложенный статический класс. Если вы это сделаете, вы получите ошибку, например, "non статический член не может использоваться в статическом контексте". Хотя класс Inner может получить доступ как к статическому, так и к нестационарному члену класса Outer.

Ответ 2

Если вам нужен доступ к переменным-членам/методам охватывающего класса, используйте нестатический вид. Если вы этого не сделаете, используйте статическую форму.

Ответ 3

статические классы отличаются от обычных классов только тем, что к ним можно получить доступ без создания экземпляров. поэтому, если вам нужен какой-то класс для доступа каждый раз, используйте static

Ответ 4

Это замечательное чтение: Статические классы в Java

Резюме:

... Итак, если вы не хотите кого-то создание экземпляра класса, который обычно, если у вас есть какие-то helper/utils, тогда я использую то, что Я называю статический класс, класс с частный конструктор и только состоит из статических методов без каких-либо любые переменные.

Ответ 5

Я бы предположил, что вы имеете в виду внутренние классы.

Я думаю, что мотивация исходит из того, как вы хотите связать свой внутренний класс. Если вы хотите, чтобы ваш внутренний класс был связан с конкретным экземпляром его внешнего класса, вы должны использовать private class, иначе используйте private static class.

Ответ 6

Мне было полезно иметь конкретное исключение в общем абстрактном классе. То есть:.

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