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

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


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. Само по себе это не имеет никакого значения, и это сразу становится очевидным.

Другие вопросы по тегам