Domanda

Nel mio progetto Android, Mi definisco un paio di callback di operare su clic sul pulsante, gli eventi di connettività, o gli eventi dell'interfaccia utente, come Dilaog.onShow (). Per demo fini, ho scelto un interfaccia Runnable che deve essere lanciato da un certo codice attività. Con Java, ho modi diversi di esprimere me stesso.

Un modello potrebbe essere quello di utilizzare classe anonima

runOnUiThread(new Runnable() { 
    public void run() { 
        doSomething(); 
    }
});

private void doSomething() {
}

un altro - per definire una classe privata interna, vale a dire

private DoSomething implements Runnable {
    public void run() { 
        // do something; 
    }
}
...
runOnUiThread(new DoSomething());

ancora un altro - per usare un membro privato, in questo modo:

private final Runnable doSomething = new Runnable() {
    public void run() { 
        // do something; 
    }
}
...
runOnUiThread(doSomething);

Ecco un altro, che mi piace di più, perché da una parte che in realtà non costruire oggetti a meno che qualcuno in realtà lo usa, perché evita lezioni extra, perché può prendere i parametri, se necessario.

private Runnable doSomething() { 
    return new Runnable() {
        public void run() { 
            // do something; 
        }
    }
}
...
runOnUiThread(doSomething());

Non sto cercando per gli argomenti di gusto o di credo religioso, ma di manutenibilità del codice e delle prestazioni. Vorrei ricevere suggerimenti e consigli che potrebbero aiutarmi a sviluppare la mia preferenza, forse -. Preferenze diverse a seconda della circostanza

Spoiler:

Il progresso di Java ha reso questa domanda obsoleto, vedere la risposta accettata.

È stato utile?

Soluzione 5

Oggi, quando è quasi disponibile per Android Java 8, e Android Studio automagicamente pretende che lambda sono già supportate, la classe anonima (1 #) soluzione sembra essere la scelta più ovvia:

crollato

espansa

Altri suggerimenti

Non credo che ci sia alcun modo idiomatico di callback maniglia.

Io di solito inline una classe anonima prima. Quando il metodo ottiene troppo grande, ho estratto la creazione di classe in una funzione separata. Quando la classe diventa troppo grande, ho estratto per il proprio file.

Se si utilizza un IDE come Eclipse è possibile eseguire automaticamente e sicuro tutti questi refactoring.

Come @Manuel Silva e @Toby Champion, Cosa non mi piace classi interne anonime. Sono un po 'difficile da leggere, non sono molto "OO", nel senso che non possono essere estesi, non può avere DIP, setter o quant'altro per ritoccare la calibrazione comportamento, ecc ..., e spesso finiscono per violare il principio DRY quando si aggiunge lo stesso codice in 27 luoghi diversi.

Io tendo ad usare membri privati ??(la vostra opzione # 3), o una funzione privata (il vostro 4 ° stile) tipicamente chiamato getAsRunnable ().

Sono molto nuovo per Android, ma le classi anonime mi fanno nausea e sembra che hai un'alternativa a runOnUiThread in ogni caso: AsyncTask, discusso in questa sede: runOnUIThread domanda

Dal mio punto di vista, classe anonima in realtà diminuire la leggibilità. Poiché il codice Ui è spesso molto prolisso, l'aggiunta di callback anonimi per ogni tasto può portare a molto molto grandi classi. Di conseguenza sto utilizzando lezioni private interne.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top