2012-01-06 14 views
16

sono venuto a Java da Visual Basic, e sembrano pensare che io sono stato, in molti modi, l'imbarazzo: plinea di istanze di oggetti e la trasformazione in Java

Esiste un modo per creare un'istanza di un oggetto e modificarlo in linea ? Qualcosa di simile:

JFrame aFrame = new JFrame(); 
aFrame.add(new JPanel() {.setSize(100,100) .setLocation(50,50) .setBackground(Color.red) }); 

ho potuto @Override metodi, ma sono alla ricerca di qualcosa di più semplice. Ho molta ricerca, ma se c'è un termine specifico per questo tipo di istanza in linea, mi sfugge.

Grazie per il vostro tempo!

risposta

26

Sì, ma alcune persone lo considerano hacky.

JFrame aFrame = new JFrame(); 
aFrame.add(new JPanel() {{ 
setSize(100,100); 
setLocation(50,50); 
setBackground(Color.red); 
}}); 

Fondamentalmente si aggiunge un altro strato di {} (blocco di inizializzazione esempio), che viene eseguito quando il pannello viene istanziata. quindi puoi inserire qualsiasi codice. (come chiamare setter).

+1

Come si chiama questa tecnica? Mi piacerebbe saperne di più. – SJuan76

+3

@ SJuan76 si chiama "classe anonima con un inizializzatore" – alf

+0

Sta usando un blocco di inizializzazione dell'istanza all'interno della classe anonima e chiama i metodi ereditati come this.setSize ... –

8

Un bel trucco è presentato nella risposta di @ ClickerMonkey. Tuttavia, se una classe supporta metodo di concatenamento, è possibile utilizzare una sintassi simile senza l'inizializzazione "hack":

new ChainClass().setSize(100,100) .setLocation(50,50) .setBackground(Color.red) 

lo svantaggio è che il ChainClass deve essere simile a questo:

public class ChainClass { 
    public ChainClass setSize(int w, int h) { 
    // ... 
    return this; 
    } 

    public ChainClass setLocation(int x, int y) { 
    // ... 
    return this; 
    } 

    // etc. 
} 

Questo è , purtroppo, non è il caso della maggior parte delle classi Java standard. Puoi comunque implementarlo per le tue lezioni.

+4

Questa interfaccia è conosciuta come Fluent. jQuery usa questa tecnica. – ComethTheNerd

+1

Che, proprio lì, è perché voglio un "questo" tipo di ritorno in java. – Kent

+0

Soprattutto a causa delle classi generiche ... il metodo di concatenamento è fastidioso con i generici quando si hanno sottoclassi. – ClickerMonkey

Problemi correlati