2012-02-06 17 views
6

Non ho mai incontrato qualcosa di simile e non conosco questo tipo di codifica! Cos'è questo? (Sono abbastanza nuovo a Java)Che tipo di chiamata del costruttore Java è questa?

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 
     }; 

Dopo costruttore chiamando c'è una doppietta (!?) E sembra che ci sia un imperativo di alcuni metodi. Quindi la parentesi viene chiusa con un punto e virgola. Non ho mai visto una parentesi dopo una chiamata al costruttore. È normale? Come si chiama? Grazie!

p.s: su Eclipse, se si rimuove il punto e virgola, viene visualizzato l'errore LocalVariableDeclarationStatement.

risposta

5

Questo è un anonymous class.

Le classi anonime possono essere utili quando si desidera creare una classe che deriva da un'altra classe o interfaccia, ma non è necessario utilizzare la nuova classe in nessun altro punto del codice.

Una delle cose più eleganti delle classi anonime è che consentono di definire una classe one-shot esattamente dove è necessario. Inoltre, le classi anonime hanno una sintassi succinta che riduce il disordine nel codice.

Nel vostro caso specifico la classe DefaultHandler è una classe helper che implementa diverse interfacce (EntityResolver, DTDHandler, ContentHandler, ErrorHandler) fornendo i metodi che non fanno nulla. L'idea è che tu possa derivare da questa classe e sovrascrivere solo i metodi specifici di cui hai bisogno. Questo può essere molto meno codice dell'implementazione diretta delle interfacce, poiché in tal caso sarà necessario fornire definizioni per ogni metodo, inclusi i metodi che non si intende utilizzare.

5

questa è la definizione di classe anonima. DefaultHandler è un'interfaccia e non ha implementazione e ne stai creando uno solo lì, mentre crei un'istanza.

dal DefaultHandler è un'interfaccia che si aspetta un oggetto di classe che implementa l'interfaccia DefaultHandler. Ma se non esiste una tale classe o se ne serve una diversa, è possibile creare un oggetto che soddisfi questo requisito implementando l'interfaccia in movimento.

+0

Sapevo che una classe che implementa un'interfaccia dovrebbe definire TUTTI i metodi dichiarati nell'interfaccia, ho sbagliato? Nel mio esempio, sono definiti solo 3 metodi! – Angelo

+1

Non è un'interfaccia, è una classe. Controlla la documentazione di DefaultHandler. –

+1

hai ragione ma 'DefaultHandler' potrebbe essere un AbstractClass e in tal caso devi definire solo i metodi astratti – destan

4

È una classe interiore anonima. Avere un google per "classe anonima java". È fondamentalmente una classe creata al volo da un'interfaccia. L'intera definizione viene specificata inline come una definizione di classe dopo la parte 'new DefaultHandler()' ovviamente questa specifica definizione di classe può essere utilizzata solo in questo posto.

1

Questa è una definizione di classe anonima. Fondamentalmente è un modo per implementare una classe astratta o estendere una classe. Quindi, stai implementando la classe DefaultHandler o extend in DefaultHandler a seconda che sia una classe abstract o una classe concreta.

Problemi correlati