Путаница с последним ключевым словом, используемым в ActivityThread - PullRequest
1 голос
/ 28 января 2011

Как показывает источник класса ActivityThread, это класс final, и все методы в этом классе также являются final методами. Как и определение ключевого слова final в java, этот класс не может быть унаследован, но почему разработчики Android сохраняют эти методы final?

Может быть, я не ясно сформулировал вопрос, я исправляю его здесь.

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

Ответы [ 2 ]

2 голосов
/ 28 января 2011

Спецификация языка Java поясняет, что ни один метод класса final не может быть переопределен.Таким образом, объявление final в методах представляется избыточным.(Может быть, осталось от бета-версии Android API, когда ActivityThread, возможно, не был окончательным классом?)

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

1 голос
/ 28 января 2011

Почему разработчики Android держат эти методы окончательно?

На самом деле, инженеры Java сделали это. Это дизайнерское решение: иногда вы хотите запретить подклассы одного из ваших классов. Зачем? Одной из причин является то, что это подразумевает некоторую сильную ответственность, которая заставляет вас принимать очень разумные решения.

Позвольте мне сослаться на часть № 17 из Effective Java Second Edition от Джошуа Блоха :

Так, что означает, что класс должен быть разработан и задокументирован для наследования? Во-первых, класс должен точно задокументировать эффекты переопределения любого метода. Другими словами, класс должен документировать свое самостоятельное использование переопределяемых методов. Для каждого открытого или защищенного метода или конструктора в документации должно быть указано, какие переопределяемые методы вызывает метод или конструктор, в какой последовательности и как результаты каждого вызова влияют на последующую обработку. (Под переопределенными мы подразумеваем не окончательные, а либо публичные, либо защищенные.) В более общем смысле класс должен задокументировать любые обстоятельства, при которых он может вызвать переопределяемый метод. Например, вызовы могут исходить из фоновых потоков или статических инициализаторов.

...

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

...