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

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


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 {}
}


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

18
задан Stephen 27 January 2010 в 16:47
поделиться

4 ответа

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

Из Sun tutorial :

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

14
ответ дан 30 November 2019 в 08:32
поделиться

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

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

5
ответ дан 30 November 2019 в 08:32
поделиться

Вы хотите посмотреть на класс NSDateFormatter :)

Ваш код будет выглядеть примерно так...

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MMM dd, yyyy HH:mm"];

NSDate *parsed = [formatter dateFromString:dateString];

S

Пример PS свободно скопирован с этого вопроса :)

-121--2447905-

Можно просто закольцовать сигналы в сигнальном модуле и настроить их.

for i in [x for x in dir(signal) if x.startswith("SIG")]:
  try:
    signum = getattr(signal,i)
    signal.signal(signum,sighandler)
  except (OSError, RuntimeError) as m: #OSError for Python3, RuntimeError for 2
    print ("Skipping {}".format(i))
-121--1557277-

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

1
ответ дан 30 November 2019 в 08:32
поделиться

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

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

5
ответ дан 30 November 2019 в 08:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: