Я относительный новичок в Java. Недавно я столкнулся с частным статическим абстрактным классом внутри обычного класса, просматривая некоторые исходные коды Android-приложений. Что может быть прецедентом для такого вложенного класса? Как он будет использоваться и какие выгоды от использования этого класса можно использовать?
Я никогда не сталкивался с этим шаблоном перед собой, но могу представить, что он полезен, если:
Подклассы абстрактного класса также могут быть частными. (Обычно, когда я пишу вложенные классы, они являются частными сведениями о реализации). Например:
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() {
}
}
}
Что может быть прецедентом для такого вложенного класса?
Вы использовали бы это, если:
Вероятно, вы также сделаете классы листьев final
или private
.
Как он будет использоваться и какие выгоды от использования этого класса можно использовать?
См. Выше. В принципе, вы скрываете класс, чтобы он не мог быть непосредственно подклассифицирован за пределами внешнего охватывающего класса. Я думаю, что это также предотвратит использование подкласса полиморфно за пределами внешнего охватывающего класса.
Это не обычный случай использования, но я полагаю, что это разумно в том контексте, в котором вы его нашли.
Целью вложенного класса является четкая группировка вложенного класса с его окружающим классом, сигнализирующая, что эти два класса должны использоваться вместе.
Вложенные классы считаются членами их окружающего класса. Таким образом, вложенный класс может быть объявлен открытым, пакетом (без модификатора доступа), защищенным и закрытым (см. Модификаторы доступа для получения дополнительной информации). Статические вложенные классы
Статические вложенные классы объявляются следующим образом:
public class Outer {
public static class Nested {
}
}
Чтобы создать экземпляр Nested, вы должны ссылаться на него, указав его именем класса Outer, следующим образом:
Outer.Nested instance = new Outer.Nested();
Статический вложенный класс по существу является нормальным классом, который только что был вложен в другой класс. Таким же образом он взаимодействует с окружающим классом. Будучи статичным, статический вложенный класс может обращаться к переменным экземпляра окружающего класса только через ссылку на экземпляр охватывающего класса.
Типичное использование заключается в замене эквивалента C struct - например, небольшого класса, который содержит имя и значение, и хранится в списке или карте в охватывающем классе. Поскольку он не используется вне модуля компиляции, он может быть закрытым.
Использование статического ключевого слова здесь немного нечетное; все это означает, что класс не связан с окружающим классом.
Сделать его абстрактным является необычным - это указывает на то, что будут конкретные реализации, и я никогда этого не делал. YMMV...