Ciao.
Stavo studiando un capitolo su come usare le espressioni lambda al posto delle classi anonime.
Argomento che affrontato da uno che programma in Natural for ADABAS che non è altro che un COBOL più potenziato e linguaggio procedurale al 90%, c'è da diventare matti!!!
Facendo qualche prova, mi sono imbattuto in un problema che non riesco a risolvere, ma credo che NON si passa risolvere....
visto il codice
package matrice;
@FunctionalInterface
public interface EseguiMatrice {
void esegui();
}
e
package matrice;
public class Matrice{
private int[] [] matrice;
private int dimX;
private int dimY;
public Matrice (int dimX, int dimY) {
this.dimX = dimX;
this.dimY = dimY;
matrice =new int[this.dimX] [this.dimY];
}
public void riempiMatrice() {
for (int i=0; i<dimX;i++) {
for (int j=0; j<dimY;j++) {
//inizio futuro override
matrice[i][j] = (int)(Math.random()*10);
//fine futuro override
}
}
}
public void stampaMatrice() {
for (int i=0; i<dimX;i++) {
for (int j=0; j<dimY;j++) {
//inizio futuro override
System.out.print(matrice[i][j] + " ");
if (j == dimY-1)
System.out.println();
//fine futuro override
}
//System.out.println(); commentato e messo sopra perché voglio fare override dentro il secondo for
}
}
public void eseguiSuMatrice(EseguiMatrice eseguiMatrice) {
for (int i=0; i<dimX;i++) {
for (int j=0; j<dimY;j++) {
eseguiMatrice.esegui();
}
}
}
}
i for annidati dei metodi riempiMatrice() e stampaMatrice() sono identici a meno della funzione che dovrebbero fare, 1 o 2 istruzioni.
A questo punto, ho creato una interfaccia funzionale su nuovo metodo eseguiSuMatrice, che facendo override al volo dovrebbe o creare la matrice o stamparla.
Questo per risparmiare codice, evitando di avere blocci identici. (Si fa anche su Natural)
A questo punto però mi sono perso qualcosa. non capisco dove fare override, teoricamente dove viene creato l'oggetto matrice e richiamato il metodo eseguiSuMatrice, ma ovviamente quqlcosa non va.
public static void main(String[] args) {
// TODO Auto-generated method stub
Matrice m = new Matrice(5,5);
m.riempiMatrice();
m.stampaMatrice();
m.eseguiSuMatrice(new EseguiMatrice() {
public void esegui() { <<<------- override del metodo dell'interfaccia
matrice[i][j] = (int)(Math.random()*10); <<<<------- ovviamente non trova matrice ne gli indici i e j
}
}
);
}
come fare override di un metodo che dovrebbe essegnare un valore e un altro che dovrebbe stanpare, dovrei farlo sulla classe Matrice.
Ho la sensazione di aver sbagliato tutto:
forse questa tecnica si usa solo se nei due metodi iniziali , si assegnano valori formule diverse? e non nel caso uno assegna e l'altro stampa?
O dovrei astrarre anche il metodo e creare una classe solo per i cicli for?
non capisco.
Qualcuno sa aiutarmi? nel frattempo modifico e faccio tentativi.
PS in Natural la procedura esegui(), funziona solo se ha una scelta, esempio:
int scelta
if scelta=1 --> stampa;
if scelta=2 --> assegna valore;
se devo fare cosi, inutile l'intefaccia funzionale, basta un metodo privato!
Grazie