elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Duda: ¿Como hago esto en Java?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda: ¿Como hago esto en Java?  (Leído 3,677 veces)
Desiresportal

Desconectado Desconectado

Mensajes: 57


Ver Perfil
Duda: ¿Como hago esto en Java?
« 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.


En línea

Maurice_Lupin


Desconectado Desconectado

Mensajes: 356

GPS


Ver Perfil WWW
Re: Duda: ¿Como hago esto en Java?
« Respuesta #1 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.


En línea

Un error se comete al equivocarse.
Desiresportal

Desconectado Desconectado

Mensajes: 57


Ver Perfil
Re: Duda: ¿Como hago esto en Java?
« Respuesta #2 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.
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Duda: ¿Como hago esto en Java?
« Respuesta #3 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 */ });
En línea

Maurice_Lupin


Desconectado Desconectado

Mensajes: 356

GPS


Ver Perfil WWW
Re: Duda: ¿Como hago esto en Java?
« Respuesta #4 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.
En línea

Un error se comete al equivocarse.
Desiresportal

Desconectado Desconectado

Mensajes: 57


Ver Perfil
Re: Duda: ¿Como hago esto en Java?
« Respuesta #5 en: 29 Diciembre 2017, 14:18 pm »

Muchas gracias. Lo probaré cuanto antes.
En línea

Desiresportal

Desconectado Desconectado

Mensajes: 57


Ver Perfil
Re: Duda: ¿Como hago esto en Java?
« Respuesta #6 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.
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Duda: ¿Como hago esto en Java?
« Respuesta #7 en: 15 Marzo 2018, 20:09 pm »

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

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Como hago Esto?
Diseño Gráfico
mandrake_69 1 1,751 Último mensaje 30 Mayo 2005, 06:52 am
por aNexos
Como hago esto ?
Programación Visual Basic
Zorrohack 1 1,329 Último mensaje 2 Febrero 2006, 05:56 am
por scod
Como hago esto ??
Diseño Gráfico
@iori@ 2 1,898 Último mensaje 17 Marzo 2006, 21:11 pm
por @iori@
como hago esto?
Programación Visual Basic
soru13 5 2,341 Último mensaje 4 Mayo 2006, 19:08 pm
por noob_Setup
Como hago esto..
Programación Visual Basic
skyweb07 1 1,424 Último mensaje 20 Septiembre 2008, 17:50 pm
por Spider-Net
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines