Какой тип вызова конструктора Java это? - PullRequest
6 голосов
/ 07 февраля 2012

Я никогда не сталкивался с чем-то подобным, и я не знаю этот тип кодирования! Что это? (Я довольно новичок в Java)

DefaultHandler handler = new DefaultHandler() {

            boolean bfname = false;
            boolean blname = false;
            boolean bnname = false;
            boolean bsalary = false;

            public void startElement(String uri, String localName,String qName, 
                    Attributes attributes) throws SAXException {

                // code

            }

            public void endElement(String uri, String localName,
                    String qName) throws SAXException {

                // code

            }

            public void characters(char ch[], int start, int length) throws SAXException {

                // code
        };

После вызова конструктора есть фигурная скобка (!?) И кажется, что некоторые методы переопределяются. Затем скобка заканчивается точкой с запятой. Я никогда не видел фигурную скобку после вызова конструктора. Это нормально? Как это называется? Спасибо!

p.s: на Eclipse, если я удалю точку с запятой, будет написано LocalVariableDeclarationStatement error.

Ответы [ 5 ]

5 голосов
/ 07 февраля 2012

это определение анонимного класса.DefaultHandler - это интерфейс, который не имеет реализации, и вы создаете его только при создании экземпляра.

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

5 голосов
/ 07 февраля 2012

Это анонимный класс .

Анонимные классы могут быть полезны, когда вы хотите создать класс, производный от другого класса или интерфейса, но вам не нужно использовать новый класс где-либо еще в вашем коде.

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

В вашем конкретном случае класс DefaultHandler является вспомогательным классом, который реализует несколько интерфейсов (EntityResolver, DTDHandler, ContentHandler, ErrorHandler), предоставляя методы, которые ничего не делают. Идея состоит в том, что вы можете наследовать этот класс и переопределять только те конкретные методы, которые вам нужны. Это может быть гораздо меньше кода, чем непосредственная реализация интерфейсов, потому что тогда вам нужно будет предоставить определения для каждого метода, включая методы, которые вы не собираетесь использовать.

4 голосов
/ 07 февраля 2012

Это анонимный внутренний класс.Есть Google для «анонимного класса Java».Это в основном класс, который создается на лету из интерфейса.Все определение, указанное в строке, воспринимается как определение класса после части «new DefaultHandler ()», очевидно, что это конкретное определение класса можно использовать только в этом месте.

1 голос
/ 07 февраля 2012

Это определение класса Anonymous. Это в основном способ реализовать абстрактный класс или расширить класс. Таким образом, вы либо реализуете класс DefaultHandler, либо extend используете DefaultHandler в зависимости от того, является ли DefaultHandler классом abstract или конкретным классом.

0 голосов
/ 07 февраля 2012

Анонимный класс использует это. http://docstore.mik.ua/orelly/java-ent/jnut/ch03_12.htm

...