Терминология — это важнейшая вещь в любом деле. Не договорившись о терминах невозможно преуспеть. Что с этим в программировании? В частности в Java? Не очень хорошо, если не сказать плохо.
Кажется нет четкой договоренности даже о базовых терминах. Например, если я скажу «внутренний класс», о чем вы подумаете? Держу пари, будет больше чем один вариант того что имеется в виду. И это очень плохо т.к. создает трудности в общении и не только.
Как исправляется такая ситуация обычно — выпускаются ГОСТы. Эти ГОСТы имеют приписку «Термины и определения». Например — ГОСТ Р 7.0.8.-2013 «Делопроизводство и архивное дело — Термины и определения».
Но ГОСТы это же скучно. Поэтому ниже я приведу свой вклад в устранение хаоса, хотя бы по части терминологии в отношении классов Java.
Итак, в Java есть классы:
- «Лучезарный» — все классы являются «лучезарными». Если вы скажете «я написал лучезарный класс», то это будет означать что это какой-то класс из нижеперечисленных, только и всего. Все нижеперечисленные классы «лучезарны»!
- «Парящий» — это класс, описание которого начинается сразу после разделов «package» и «import» исходного .java-файла.
- «Крадущийся» — крадущиеся классы 'живут' (определяются) только внутри «парящих». Это обобщающее понятие для нижеперечисленных видов классов.
- «Испепеляющий» — это статический класс объявленный непосредственно внутри «крадущегося»
- «Пронзающий» — это НЕ статический класс объявленный непосредственно внутри «крадущегося»
- «Тенеподобный» — это анонимный класс
- «Рыскающий» — это локальный класс. Объявляется в блоках кода (в методах классов), впрочем как и «тенеподобный»
Уточнение на всякий случай: в этой схеме «Лучезарный» — это обобщение для всех видов классов вообще, а «Крадущийся» — это обобщение для всех тех «Лучезарных» классов которые не являются «Парящими».
Подбробнее
Парящий
- основной вид классов — располагается непосредственно на «верхнем уровне» исходных .java-файлов
Испепеляющий
Пример:
//А - парящий класс
public class A {
//B - испепеляющий класс
public static class B {
}
}
- по сути ничем не отличается от парящего класса, кроме места своего объявления
- не имеет доступа к не статическим элементам своего родительского парящего класса
Пронзающий
Пример:
//А - парящий класс
public class A {
//B - пронзающий класс
public class B {
}
}
- имеет доступ ко всем элементам родительского, парящего класса
- не может иметь статических объявлений
- не будучи объявленным как public может быть инстанцирован только внутри своего родительского парящего класса
Тенеподобный
Пример:
new Thread(new Runnable() {
public void run() {
...
}
}).start();
//то что внутри Thread(...) - это тенеподобный класс
- располагается внутри блоков кода (в методах). Все другие классы сначала пишутся с присвоением имени и затем это имя как-то используется. Этот же класс пишется без имени и сразу же используется с оператором new, т.е. сразу инстанцируется
- имеет доступ к элементам обрамляющего класса
- имеет доступ к локальным элементам обрамляющего блока кода (к переменным метода например)
- не может внутри себя определять static элементы кроме static final
Рыскающий
Пример:
//А - парящий класс
public class A {
public void method1() {
//B - рыскающий класс
class B {
...
}
}
}
- располагается внутри блоков кода (в методах)
- имеет доступ к элементам обрамляющего класса
- имеет доступ к локальным элементам обрамляющего блока кода (к переменным метода например)
- виден только в пределах блока где определен
- не может быть объявлен как private, public, protected или static
- не может внутри себя определять static элементы кроме static final
Заключение
Этой терминологии я дал имя [ydax] — случайное, но уникальное имя в пределах меня, сгенерированно специальным скриптиком.
А теперь возрадуемся братья и сестры — хоаса с этом мире стало меньше! Пользуйтесь этой терминологией, а если кому-то что-то будет не понятно — кидайте ссылку на эту статью. Гуд бай )
P.S. эту статью можно принять за стёб, но это не так — в каждой шутке лишь доля шутки )
P.P.S. если где неверную информацию привел — поправляйте меня
Автор: ssurrokk