частные абстрактные классы в Java [дубликаты]

1

Я относительный новичок в Java. Недавно я столкнулся с частным статическим абстрактным классом внутри обычного класса, просматривая некоторые исходные коды Android-приложений. Что может быть прецедентом для такого вложенного класса? Как он будет использоваться и какие выгоды от использования этого класса можно использовать?

Теги:
class
private
abstract

4 ответа

9
Лучший ответ

Я никогда не сталкивался с этим шаблоном перед собой, но могу представить, что он полезен, если:

  • Вы хотите реализовать интерфейс аналогичным образом в связке вложенных классов (например, для возврата из общедоступных методов в класс-оболочку)
  • Эти реализации интерфейса имеют много общего кода (следовательно, абстрактный класс)
  • Вам не нужен какой-либо код, отличный от реализаций, чтобы узнать об абстрактном классе

Подклассы абстрактного класса также могут быть частными. (Обычно, когда я пишу вложенные классы, они являются частными сведениями о реализации). Например:

public interface Foo {
    // Methods here
}

public class FooFactory {

    public static Foo getFoo1() {
        return new Foo1();
    }

    public static Foo getFoo2() {
        return new Foo2();
    }

    private static abstract class AbstractFoo implements Foo {
        // Implement methods in Foo in terms of 
        // doSomething()...

        // Implementation-specific method
        public abstract void doSomething();
    }

    private static class Foo1 extends AbstractFoo {
        public void doSomething() {
        }
    }

    private static class Foo2 extends AbstractFoo {
        public void doSomething() {
        }
    }
}
2

Что может быть прецедентом для такого вложенного класса?

Вы использовали бы это, если:

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

Вероятно, вы также сделаете классы листьев final или private.

Как он будет использоваться и какие выгоды от использования этого класса можно использовать?

См. Выше. В принципе, вы скрываете класс, чтобы он не мог быть непосредственно подклассифицирован за пределами внешнего охватывающего класса. Я думаю, что это также предотвратит использование подкласса полиморфно за пределами внешнего охватывающего класса.

Это не обычный случай использования, но я полагаю, что это разумно в том контексте, в котором вы его нашли.

0

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

Вложенные классы считаются членами их окружающего класса. Таким образом, вложенный класс может быть объявлен открытым, пакетом (без модификатора доступа), защищенным и закрытым (см. Модификаторы доступа для получения дополнительной информации). Статические вложенные классы

Статические вложенные классы объявляются следующим образом:

public class Outer {

  public static class Nested {

  }

}

Чтобы создать экземпляр Nested, вы должны ссылаться на него, указав его именем класса Outer, следующим образом:

Outer.Nested instance = new Outer.Nested();

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

  • 1
    Это все хорошая информация, но я не думаю, что она отвечает на вопрос.
0

Типичное использование заключается в замене эквивалента C struct - например, небольшого класса, который содержит имя и значение, и хранится в списке или карте в охватывающем классе. Поскольку он не используется вне модуля компиляции, он может быть закрытым.

Использование статического ключевого слова здесь немного нечетное; все это означает, что класс не связан с окружающим классом.

Сделать его абстрактным является необычным - это указывает на то, что будут конкретные реализации, и я никогда этого не делал. YMMV...

  • 0
    Почему пара имя / значение должна быть абстрактной?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню