Джава.у местных классов есть ли причина не делать это окончательным? - PullRequest
7 голосов
/ 15 ноября 2011

У меня вопрос о локальных классах в Java (классах, которые объявляются в методе или в блоках, ограниченных {}).

Есть ли какая-либо причинане объявлять локальный класс как final ?Мы не можем наследовать другой класс от локального класса (если он не определен в той же области видимости), но когда мы объявляем его как final , возможно, компилятор может сделать код намного проще?

Спасибо!

Ответы [ 4 ]

6 голосов
/ 15 ноября 2011

Люди, кажется, немного смущены анонимными классами и локальными классами.Это локальный класс:

public void m() {
   class MyClass{}
   MyClass cl = new MyClass();
}

Вы можете объявить MyClass final, но на самом деле его можно наследовать, так как в любом другом месте в Java можно объявить его окончательным дляИзбегайте этого:

public void m() {
   class MyClass{}
   MyClass cl = new MyClass();
   class MyOtherClass extends MyClass{}
   MyOtherClass cl2 = new MyOtherClass();
}

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

1 голос
/ 15 ноября 2011

Нет никаких причин не объявлять final в любом случае, кроме случаев, когда вы явно стремитесь к наследованию.

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

Вопрос об универсальном использовании ключевого слова final с очень хорошими ответамиможно найти здесь

0 голосов
/ 15 ноября 2011

«классами, которые объявляются в методе», являются анонимные классы , а «классами, которые объявляются в блоках, ограниченных {}», являются внутренние классы .

Анонимные классы не могут быть объявлены как final, потому что нет способа наследовать их.

Внутренние классы могут быть final, если не будет каких-либо его подклассов.

0 голосов
/ 15 ноября 2011

Нет причин не делать этого, за исключением того, что это ненужное ключевое слово в вашем коде.то есть.нет причин не делать этого.Если класс объявлен в методе, то к нему нельзя получить доступ из любого другого места и, следовательно, нельзя разделить на подклассы.Так зачем предотвращать то, что нельзя сделать?

Поэтому добавление слова никоим образом не меняет поведение, но загромождает ваш код.Кто-то может подумать: «Почему этот класс окончательный, я что-то упустил?»

...