Непубличный класс верхнего уровня против статического вложенного класса

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


A.java


public class A 
{
    public static main (String[] args)
    {
        AHelper helper = new AHelper();     
    }
}
class AHelper {}


A.java


public class A
{
    public static main (String[] args)
    {
        A.AHelper helper = new A.AHelper();     
    }

   static class AHelper {}
}


Помимо того, как они ссылаются, мне кажется очень мало различий между двумя способами создания класса-помощника. Вероятно, это зависит главным образом от предпочтений; кто-нибудь видит что-то, что мне не хватает? Я полагаю, что некоторые люди будут утверждать, что лучше иметь один класс для исходного файла, но с моей точки зрения кажется более чистым и более организованным, чтобы иметь непубличный класс верхнего уровня в том же исходном файле.

Ответ 1

В любом примере у вас нет одного класса для исходного файла. Но, как правило, вы используете статический вложенный класс для обозначения того, что он предназначен только для использования в своем охватывающем классе (заставляя его ссылаться как A.AHelper). Это не так ясно, если вы переместите этот класс на верхний уровень.

Из Sun tutorial:

Логическая группировка классов. Если класс полезен только для одного другого класса, то логично встроить его в класса и держите их вместе. Вложение таких "вспомогательных классов" делает их пакет более упорядочен.

Ответ 2

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

Еще одно соображение - повторное использование кода - вы можете помочь своему помощнику помочь нескольким классам в вашем пакете.

Ответ 3

Одно отличие состоит в том, что статический вложенный класс может быть объявлен открытым. Вы не можете сделать это для любого другого класса в том же файле, что и основной класс, поскольку общедоступный класс основного уровня должен иметь то же имя, что и имя файла.

Таким образом, вы можете объявить много публичных классов в одном файле, но только один из них является основным. Другие статические вложенные классы должны быть связаны хотя бы с основным классом, или это не имеет смысла делать это.

Ответ 4

Вложение класса (статически в Java) отправляет четкое сообщение намерение: вложенный класс AHelper применим только для поддержки класса A. Он не имеет никакого значения сам по себе, и это сразу становится очевидным.