Непубличный класс верхнего уровня против статического вложенного класса
Мне кажется, что непубличные классы верхнего уровня и статические вложенные классы по существу выполняют одни и те же задачи при создании вспомогательного класса.
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. Он не имеет никакого значения сам по себе, и это сразу становится очевидным.