Непубличный класс верхнего уровня против статического вложенного класса
Мне кажется, что непубличные классы верхнего уровня и статические вложенные классы, по сути, выполняют одни и те же задачи при создании вспомогательного класса.
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 {}
}
Помимо того, как на них ссылаются, мне кажется, что между двумя способами создания вспомогательного класса очень мало различий. Это, вероятно, сводится в основном к предпочтениям; кто-нибудь видит что-то, что мне не хватает? Я предполагаю, что некоторые люди будут утверждать, что лучше иметь один класс на исходный файл, но с моей точки зрения кажется более чистым и организованным иметь непубличный класс верхнего уровня в одном и том же исходном файле.
4 ответа
Ни в одном из примеров у вас нет одного класса на исходный файл. Но, как правило, вы используете статический вложенный класс, чтобы показать, что он предназначен для использования только в пределах его окружающего класса (для того, чтобы на него ссылались как на A.AHelper
). Это не так ясно, если вы переместите этот класс на верхний уровень.
Из Солнца учебник:
Логическая группировка классов. Если класс полезен только для одного другого класса, то логично встраивать его в этот класс и сохранять их вместе. Вложение таких "вспомогательных классов" делает их пакет более упорядоченным.
Одна вещь, которая приходит на ум, это область действия вспомогательного класса. Вложенный класс имеет доступ к закрытым членам родительского класса. Если помощник находится в своем собственном файле, такой доступ вам не понравится, хотя его легко обработать с помощью видимой области видимости пакета по умолчанию.
Еще одно соображение - повторное использование кода - вы можете попросить своего помощника помочь нескольким классам в вашем пакете.
Одно отличие состоит в том, что статический вложенный класс может быть объявлен как открытый. Вы не можете сделать это для любого другого класса в том же файле, что и основной класс, так как общедоступный класс основного уровня должен иметь то же имя, что и имя файла.
Таким образом, вы можете объявить много открытых классов в одном файле, но только один из них является основным уровнем. Другие статические вложенные классы должны быть связаны с основным классом, иначе это не имеет смысла.
Вложение класса (статически в Java) отправляет четкое сообщение о намерении: вложенный класс AHelper релевантен и может использоваться только для поддержки класса A. Само по себе это не имеет никакого значения, и это сразу становится очевидным.