[Java] inner classes -- пара вопросов

psihodog

Почему в inner-классах нельзя использовать:
1. нефинальные локальные переменные?
2. static-блоки?
PS Насчёт нефинальных переменных, кажется начинаю понимать, а вот с блоками-то что не так?

bastii

а что за статик блоки?

bastii

Кстати, про нефинальные переменные было уже. Просто из стека в кучу копировать надо, в случае финальных получается, что как бы без разницы. Им просто это решение показалось логичнее, что будет вызывать меньше ошибок.

psihodog

A static initialization block begins with the static keyword and is a normal block of code enclosed in braces: { and }.
A class can have any number of static initialization blocks that appear anywhere in the class body. The runtime system guarantees that static initialization blocks and static initializers are called in the order (left to right, top to bottom) that they appear in the source code.
E.g.
class A {
static int a;
static {
a= 1;
System.out.println("a= "+a);
}
}

bastii

А ты про статические конструкторы. Есть версия. Что иннер классы рассматриваются концептуально как часть внешних классов, поэтому возможно хотят, чтобы последовательно выполнения статических блоков согласовывалась с внешним классом. А это уже скорее всего не очень катит с точки зрения возможных реализации. Бред конечно
Потом ведь все статические дела вроде без проблем можно вынести во внешний класс.

psihodog

Ага, теперь нашёл.
В общем, я так и думал... Тоже не перестаю удивляться, что это нигде не разъяснено.
Что за свинство, заставлять программистов думать самих!

psihodog

Потом ведь все статические дела вроде без проблем можно вынести во внешний класс.
Пожалуй, если учесть, что во внутренних классах нельзя объявлять статические переменные...

anton7805

забей на это,ни разу за год проганья на джаве не писал inner -классов, это излишки

enochka1145

В общем, отец уже всё сказал.
1. final - это чтобы никто пальцем не трогал. В том числе не разрушал. Иначе как ты этой локальной переменной воспользуешься, если в качестве внутреннего класса выступает какой-нибудь Thread, который обращается к этой переменной уже после того, как эта переменная разрушилась? final говорит "скопируйте-ка мне её куда-нибудь, всё равно никто её менять не собирвается - она же final..."
2. В Java есть точная последовательность выполнения всяческих конструкторов и блоков static { }. Думаю, если позволить внутренним классам иметь блоки static { } (а их точно нет? это сделает эту последовательность слишком сложной. А зачем языку Java что-то слишком сложное? Для этого есть C++

Hastya

1. нефинальные локальные переменные?
Это с чего ты взял?

enochka1145

Java Language Specification:
"8.1.2 Inner Classes and Enclosing Instances
An inner class is a nested class that is not explicitly or implicitly declared static. Inner classes may not declare static initializers (§8.7) or member interfaces. Inner classes may not declare static members, unless they are compile-time constant fields (§15.28).
...
Any local variable, formal method parameter or exception handler parameter used but not declared in an inner class must be declared final, and must be definitely assigned (§16) before the body of the inner class.
..."

enochka1145

Кажется придумал отмазку насчёт static-блоков внутреннего классов.
Экземпляры классов делят static-элементы между собой. Между кем делить static-элементы внутренних классов? Между всеми экземплярами внутренних классов, сделанных одним внешним классом? Между всеми экземплярами внутренних классов, сделанных ВСЕМИ внешними классами? Так как у внутреннего класса всегда есть this внешнего, то более логичным является первый вариант, но это приуменьшает идею static. Чтобы не возиться со всем этим, решили такие static вообще запретить.

Hastya

before the body of the inner class
а теперь внимательно прочти еще раз
вопрос - локальные переменные кого?
ты вырезал кусок, который на самом деле относился к анонимным внутренним классам.

bastii

psihodog

Да, я об этом тоже уже подумал.

psihodog

какая хрен разница -- анонимные или нет?

Hastya

Ну ты парень даешь! Ты еще скажи, без разницы - статический он или нет.

psihodog

и всё же...
Оставить комментарий
Имя или ник:
Комментарий: