Непубличный класс верхнего уровня против статического вложенного класса - PullRequest
18 голосов
/ 27 января 2010

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


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 ]

14 голосов
/ 27 января 2010

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

Из учебника Sun :

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

5 голосов
/ 28 января 2010

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

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

5 голосов
/ 27 января 2010

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

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

1 голос
/ 27 января 2010

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

...