Duda: ¿Como hago esto en Java?

Iniciado por Desiresportal, 20 Diciembre 2017, 15:06 PM

0 Miembros y 2 Visitantes están viendo este tema.

Desiresportal

Muy buenas.

Por la razón que sea he empezado a programar en Java y tengo una duda al respecto. En C++ podía hacer algo como lo siguiente para hacer una programación final mas adaptable:


Código (cpp) [Seleccionar]
// Codigo para usar como parte de una libreria

void (*funcionLibreria)(int value);

void asignarFuncionLibreria(void (*funcionAsignada)(int value)) {
funcionLibreria= funcionasignada;
}


// Codigo para desarrollar en un proyecto

void funcionDefinidaPorMi(int value) {
// Codigo de la funcion en cuestion.
}

// Algo de codigo despues...

funcionLibreria(5);



¿Como puedo hacer algo así en Java?

He buscado algo para Java, pero solo encuentro callbacks que me parecen mas difíciles de usar. Sino, lo único que encuentro es para javascript.

Quiero desarrollar una librería que ya sé que va a ser muy larga y rebuscar en el código Java para adaptarlo a cada proyecto me parece una locura.

Me sería de gran ayuda. Gracias de antemano.

Maurice_Lupin

Hola Desiresportal.

Para llamar a una función como parametro puedes implementar interface
http://java-buddy.blogspot.pe/2013/02/implement-callback-method-using.html

Saludos.
Un error se comete al equivocarse.

Desiresportal

No termino de entender muy bien los callback.

He intentado adaptar lo que encontré en internet a mi caso, pero no he llegado a nada util. Paso a explicar el uso que quiero darle y ya me direis.

La idea es desarrollar una libreria tal que así para no retocarla de proyecto en proyecto:

public class claseEscena {
private funcionAct;
private funcionDraw;

public claseEscena(funcionActRecibida, funcionDrawRecibida) {
this.funcionAct = funcionActRecibida;
this.funcionDraw = funcionDrawRecibida;
}

public void act() {
this.funcionAct();
}

public void draw() {
this.funcionDraw();
}
}

ArrayList<claseEscena> misEscenas = new ArrayList<claseEscena>();

public void gameLoop() {
while(1) {
for (int a=0; a<misEscenas.size(); a++) {
misEscenas.act();
}
for (int a=0; a<misEscenas.size(); a++) {
misEscenas.draw();
}
}
}


Y despues, para desarrollar el codigo de un proyecto concreto, algo mas o menos así:


public void miFuncionAct1() {
// Mi codigo de actuacion para la escena...
}

public void miFuncionDraw1() {
// Mi codigo de dibujado para la escena....
}

public void miFuncionAct2() {
// Mi codigo de actuacion para la escena...
}

public void miFuncionDraw2() {
// Mi codigo de dibujado para la escena....
}

misEscenas.add(new claseEscena(miFuncionAct1, miFuncionDraw1));
misEscenas.add(new claseEscena(miFuncionAct2, miFuncionDraw2));

gameLoop();


En C++ lodré hacer algo así, pero en Java estoy teniendo serias dificultades para simplificar la programacion final de cualquier proyecto.

¿Me podeis poner algun ejemplo de como lograrlo?

Evidentemente, el gameLoop lo he simplificado en el ejemplo porque la intencion del ejemplo es dejarlo lo mas limpio posible.

Gracias de antemano.

ivancea96

Empecemos por lo básico.
En Java no vas a poder pasar punteros a funciones como tal.
En Java se pasan objetos o valores nativos, que no vienen al caso ahora.
Cuando una función recibe un "callback", del tipo que sea, lo que recibe es un objeto con (generalmente) 1 método que será llamado. Por ejemplo, una función podría recibir como parámetro una interfaz como esta:

Código (java) [Seleccionar]
interface Callback {
    void doIt();
}


Y esta sería la clae que almacena el "callback":

Código (java) [Seleccionar]
public class Test {
    private Callback callback;

    public Test(Callback callback) {
        this.callback = callback;
    }

    public callIt() {
        callback.doIt();
    }
}


Eso es todo, no hay más. En Java todo es muy simple, solo hay que adaptarse a ello.

Además, en Java 8, se ha agregado una sintaxis para los callbacks de este estilo. Antes, se hacía así una "lambda":

Código (java) [Seleccionar]
Test test = new Test(new Callback(){
    public void doIt(){
        // Code
    }
});


Ahora, con Java 8:
Código (java) [Seleccionar]
Test test = new Test(() -> { /* Code */ });

Maurice_Lupin

Así quedaría.
Código (java) [Seleccionar]
interface Callback {
    void act();
    void draw();
}

class ClaseEscena {
    Callback callback;
   
    public ClaseEscena(Callback callback) {
this.callback = callback;
    }

     public void act() {
        callback.act();
     }

     public void draw() {
callback.draw();
     }
}

// static void main(...
ClaseEscena escena1 = new ClaseEscena( new Callback(){
  public void act(){
    System.out.println("FuncionAct1");
  }
 
  //public void draw(){...
   
});
escena1.act();
escena1.draw();


Saludos.
Un error se comete al equivocarse.

Desiresportal

Muchas gracias. Lo probaré cuanto antes.

Desiresportal

Me ha funcionado a la perfección. Muchas gracias por la ayuda. Seguro que vuelvo con mas dudas otro día.

De nuevo: gracias.

ivancea96

3 meses para un código de 50 líneas!