Foro de elhacker.net

Programación => Java => Mensaje iniciado por: Desiresportal en 20 Diciembre 2017, 15:06 pm



Título: Duda: ¿Como hago esto en Java?
Publicado por: Desiresportal en 20 Diciembre 2017, 15:06 pm
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
  1. // Codigo para usar como parte de una libreria
  2.  
  3. void (*funcionLibreria)(int value);
  4.  
  5. void asignarFuncionLibreria(void (*funcionAsignada)(int value)) {
  6. funcionLibreria= funcionasignada;
  7. }
  8.  
  9.  
  10. // Codigo para desarrollar en un proyecto
  11.  
  12. void funcionDefinidaPorMi(int value) {
  13. // Codigo de la funcion en cuestion.
  14. }
  15.  
  16. // Algo de codigo despues...
  17.  
  18. funcionLibreria(5);
  19.  
  20.  

¿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.


Título: Re: Duda: ¿Como hago esto en Java?
Publicado por: Maurice_Lupin en 22 Diciembre 2017, 16:56 pm
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.


Título: Re: Duda: ¿Como hago esto en Java?
Publicado por: Desiresportal en 26 Diciembre 2017, 13:29 pm
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:

Código:
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í:


Código:
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.


Título: Re: Duda: ¿Como hago esto en Java?
Publicado por: ivancea96 en 26 Diciembre 2017, 13:50 pm
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
  1. interface Callback {
  2.    void doIt();
  3. }

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

Código
  1. public class Test {
  2.    private Callback callback;
  3.  
  4.    public Test(Callback callback) {
  5.        this.callback = callback;
  6.    }
  7.  
  8.    public callIt() {
  9.        callback.doIt();
  10.    }
  11. }

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
  1. Test test = new Test(new Callback(){
  2.    public void doIt(){
  3.        // Code
  4.    }
  5. });

Ahora, con Java 8:
Código
  1. Test test = new Test(() -> { /* Code */ });


Título: Re: Duda: ¿Como hago esto en Java?
Publicado por: Maurice_Lupin en 26 Diciembre 2017, 16:04 pm
Así quedaría.
Código
  1. interface Callback {
  2.    void act();
  3.    void draw();
  4. }
  5.  
  6. class ClaseEscena {
  7.    Callback callback;
  8.  
  9.    public ClaseEscena(Callback callback) {
  10. this.callback = callback;
  11.    }
  12.  
  13.     public void act() {
  14.        callback.act();
  15.     }
  16.  
  17.     public void draw() {
  18. callback.draw();
  19.     }
  20. }
  21.  
  22. // static void main(...
  23. ClaseEscena escena1 = new ClaseEscena( new Callback(){
  24.  public void act(){
  25.    System.out.println("FuncionAct1");
  26.  }
  27.  
  28.  //public void draw(){...
  29.  
  30. });
  31. escena1.act();
  32. escena1.draw();

Saludos.


Título: Re: Duda: ¿Como hago esto en Java?
Publicado por: Desiresportal en 29 Diciembre 2017, 14:18 pm
Muchas gracias. Lo probaré cuanto antes.


Título: Re: Duda: ¿Como hago esto en Java?
Publicado por: Desiresportal en 14 Marzo 2018, 12:12 pm
Me ha funcionado a la perfección. Muchas gracias por la ayuda. Seguro que vuelvo con mas dudas otro día.

De nuevo: gracias.


Título: Re: Duda: ¿Como hago esto en Java?
Publicado por: ivancea96 en 15 Marzo 2018, 20:09 pm
3 meses para un código de 50 líneas!