Dovresti creare una classe all'interno di un metodo?

5

Ho creato un programma utilizzando Java che è un'implementazione di questo progetto: link . In sostanza, si crea un'espressione matematica e, utilizzando la coordinata di pixel come input, si crea un'immagine. Dopo averlo implementato inizialmente in serie, l'ho poi implementato in parallelo a causa del fatto che se la dimensione dell'immagine è troppo grande o se l'espressione matematica è troppo complessa (specialmente considerando il fatto che ho fatto l'espressione in modo ricorsivo), richiede un davvero molto tempo. Durante questo processo, mi sono reso conto che avevo bisogno di due classi che implementassero l'interfaccia Runnable perché dovevo inserire parametri per il metodo run , che non ti è permesso fare direttamente. Una di queste classi ha finito per essere una classe interna statica di medie dimensioni (non abbastanza grande da rendere comunque un file di classe indipendente). L'altro però, solo bisogno di alcuni parametri per determinare alcuni indici e la dimensione del ciclo for che stavo facendo correre in parallelo - eccolo qui:

class DataConversionRunnable implements Runnable
    {
        int jj, kk, w;

        DataConversionRunnable(int column, int matrix, int wid)
        {
            jj = column;
            kk = matrix;
            w = wid;
        }

        public void run()
        {
            for(int i = 0; i < w; i++)
                colorvals[kk][jj][i] = (int) ((raw[kk][jj][i] + 1.0) * 255 / 2.0);
            increaseCounter();
        }
    }

La mia domanda è: dovrei renderla una classe interiore statica o posso semplicemente crearla in un metodo? Qual è la convenzione generale di programmazione seguita in questo caso?

    
posta Amndeep7 11.07.2012 - 05:11
fonte

2 risposte

3

Jon Lin ha la soluzione che desideri. (+1 a Jon) Una classe anonima è la strada da percorrere. Altrimenti: se si desidera utilizzare la stessa classe più di una volta, è possibile utilizzare una classe locale con nome, proprio come nella domanda. Se ti serve in più di un metodo, passa a una classe interna privata . Se aiuta altre classi a lavorare con la classe genitore, usa una classe interna pubblica. Se non è strettamente legato al suo genitore, mettilo nel suo file.

L'idea di base è l'incapsulamento della classe (al contrario dei dati - una variabile o un campo). La classe stessa dovrebbe essere nota solo al codice che deve esserne a conoscenza. Se si fa una classe nidificata, qualcuno che guarda il riferimento deve cercare il codice di classe e qualcuno che guarda il codice di classe annidato deve cercare un riferimento. Con un buon IDE questo non è troppo difficile, ma con classi locali / anonimi è facile anche quando si guarda il codice nel Blocco note. E poi c'è il problema di ottenere dati in e da la classe ....

Java è davvero buono con questo. Alcune altre lingue non consentono classi locali. Per essere giusti, non li richiedono, o - molte classi standard Java sono scritte con l'idea che l'utente può facilmente generare sciami di classi locali e temporanee. Ma, come nel tuo caso, le classi locali sono abbastanza utili anche senza le classi di sistema che le desiderano.

    
risposta data 11.07.2012 - 20:07
fonte
6

Puoi utilizzare una classe anonima che assomiglierebbe a qualcosa del genere:

final int column = (something);
final int matrix = (something);
final int wid = (something);

Thread t = new Thread(new Runnable() {
    public void run() {
        for(int i = 0; i < wid; i++)
            colorvals[matrix][column][i] = (int) ((raw[matrix][column][i] + 1.0) * 255 / 2.0);
        increaseCounter();
    }
});

t.run();

Utilizzeresti qualcosa di simile (classe anonima) se lo userai in un solo posto nella tua classe. Se vuoi usarlo o farne riferimento in più di un posto, usi una classe interiore.

    
risposta data 11.07.2012 - 06:37
fonte

Leggi altre domande sui tag