2016-03-18 2 views
2

Я учу себя java, и мне это действительно нравится, однако я пришел к теме «Анонимный класс», и я пытаюсь понять, когда и где вы будете использовать это, из того, что моя книга говорит, что это очень популярный класс, но я, похоже, не могу его обойти, я понимаю, как их создавать. но я просто искал немного больше информации, поэтому я могу начать реализовывать их в своих классах.Анонимные классы, когда и где?

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

+2

Я вообще избегаю их, как чуму TBH, если только я не пытаюсь написать несколько простых классов, чтобы проверить что-то. Они не нужны ни в каком смысле. В полной производственной среде они обычно не нужны или не желательны и просто усложняют код без необходимости. Гораздо проще просто писать дискретные классы в незаметных файлах и разрешать разделение работы/проблем. Но некоторые люди могут найти для них большую пользу. Я думаю, что они почти бесполезны, за исключением очень простых целей тестирования или очень маленьких сдержанных анонимных классов только нескольких строк, которые реализуют, скажем, ActionListener и т. Д. – ManoDestra

+4

Предлагаю вам прочитать код в библиотеках коллекций под java.util. У этого есть много примеров. Я также предлагаю вам прочитать все классы в java.lang. Вы были бы поражены тем, сколько людей не читали источник даже самых распространенных библиотек. ;) –

+0

Я бы сказал, что в Java 8, для большинства целей и задач, анонимный класс был заменен выражением лямбда. Понимание анонимных классов остается важным для чтения и сохранения устаревшего кода. – scottb

ответ

8

Во-первых, вам никогда не нужно анонимный класс. Вы всегда можете создать именованный класс. Когда вы начинаете, основная причина узнать об анонимных классах - распознать их в коде, который вы читаете.

Вы используете анонимный класс в тех случаях, когда вы хотите создать какой-либо объект, чтобы использовать его только один раз. В основном они пригождаются в программировании, управляемом событиями, например, с использованием Swing. Ваш обработчик событий обычно является одноразовым, специфичным для элемента управления, в который вы его подключаете, поэтому нет смысла указывать ему имя.

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

Хорошие стартовые примеры приведены в the Oracle Java tutorial. Классы FileFilter и FilenameFilter в пакете java.io часто используются с анонимными классами, чтобы указать, какие файлы должен возвращать фильтр.

В Java 8 lambdas дает вам лучший способ создания одноразовых экземпляров классов только с одним методом.

+1

Очень хороший пост +1. Часто, особенно в управляемом событиями коде, хотя анонимный класс записывается один раз, экземпляр его создается один раз на событие или вызов, а затем отбрасывается.В таком случае более эффективное использование ресурсов будет получено путем назначения анонимного класса статической константе или перечислению или с использованием именованного класса и использования этого вместо повторного создания анонимного класса. – scottb

+0

@scottb: Я не могу придумать пример этого, но да, присвоение анонимного экземпляра константе, конечно, нормально. –

+0

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

0

Если вы пишете именованный класс SomeClass, тогда вам нужно только один раз написать new SomeClass, но часто имеет смысл использовать анонимный класс.

Вы должны делать это только в том случае, если тело класса является коротким (в противном случае читаемость страдает), и если вы не можете использовать ссылку на лямбда или метод.

+1

* ", тогда вам нужно только написать новый SomeClass один раз" * ... мы * когда-либо * пишем один и тот же класс более одного раза? – scottb

+0

@scottb Я не говорю о написании одного и того же класса только один раз, я говорю только о вызове конструктора в одном месте. –

Смежные вопросы