style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Variables tipo macro en java

Hola, necesito introducir dentro de una variable una sentencia para ejecutar luego. Ejemplo var='campo.getText()' donde el campo varia de acuerdo al valor que va tomando dentro un bucle.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Nopalin

Que yo sepa no se puede

que yo sepa en java no se puede realizar algo similar, sin embargo puedes hacerlo utilizando reflection.

//almacenar el metodo que quieres ejecutar
java.lang.Method metodo = campo.getClass().getMethod("getText", (Class[])null);

//para ejecutarlo despues
metodo.invoke(campo, (Object[])null);

sobres

Imagen de benek

Closures

Ese es el concepto de closure, una función que reside dentro de una variable. En Java aún no están disponibles (tengo entendido que la versión 7 sí tendrá closures).

Hazlo como dice Nopalin con Reflection o también puedes ayudarte con Groovy: http://groovy.codehaus.org/Closures

Re: Variables tipo macro en java

Supongo que vienes de programar en C. Te sugiero que dejes de "pensar en C" y mejor "piensa en Java". No preguntes cuál es el equivalente en Java para un idioma propio de C, donde por cierto no aclaras si basta con que el problema se resuelva en tiempo de compilación o en tiempo de ejecución. Mejor plantea tu problema y así se te podrá proporcionar una solución orientada a objetos.

Saludos

Javier Castañón
PD Esto incluye el uso de templates, en caso de que vengas de C++ ¿ok?

Imagen de benek

Re: Closures

Me corrijo ya que no estaba actualizado. La propuesta para integrar Closures al JDK7 finalmente no fue aprobada.

Imagen de ezamudio

Utilidad

La verdad es que en todos los años que llevo programando en Java, pocas veces me he encontrado con la necesidad de utilizar algo como closures. Pero sí he estado una o dos veces frente al código pensando si tan sólo pudiera pasar aquí un método como parámetro, esto sería más fácil... y al final esos casos sí tienen solución, pero es un poco más enredosa:

  1. Crear una interfaz que define el método que necesito pasar como parámetro
  2. Implementar la interfaz en el objeto más adecuado para el problema que quiero solucionar, a veces incluso una clase anónima declarada inline
  3. En el método que recibe ese objeto de la interfaz nueva, invocar el método del objeto que implementa la interfaz

Esto de hecho es un patrón de diseño llamado Command, aunque los rucos le decimos simplemente callback. Tal vez por esto es que al final no los aprobaron, en conjunto con que alguien dijo "si alguien quiere closures a fuerzas, ya estará usando Scala o Groovy de todas formas"...

Re: Utilidad

Concurro con ezamudio. En Java *nunca*, pero *nunca* vas a extrañar los closures, a menos que hayas programado en otro lenguaje. bueno, me confieso culpable de haber escrito código Java más o menos ilegible usando clases anónimas, pero ¡qué padre código! (si no, pregúntenle a Spring JDBC-template)

OK, levanten la mano los que han hecho esto en JavaScript y lo extrañan en Java:

var fn = function() {};

Además, los patrones no son sólo soluciones recurrentes, sirven también para subsanar carencias en los lenguajes de programación. Hay patrones que no se necesitan en otros lenguajes porque los problemas que resuelven no existen en otros lenguajes.

Saludos

Javier Castañón

Imagen de ezamudio

OGNL

Otra opción para hacer cosas similares a lo que pides es este proyecto.

macro de sustitucion

Lo que necesito es recoger con un bucle los valores de los JText introducidos por el usuario e ir concatenando en una variable que contendra los valores de todos los campos del JText. El valor de cada JText 1. JText2....., etc.
Ejemplo:
campo=JText1;
var= var + campo.setText();

Como hacer que me ejecute la sentencia: campo.setText();
y de acuerdo a la posicion del bucle me vaya tomando el valor del siguiente JText ??

Gracias...

Imagen de Nopalin

arreglos

con reflection nuevamente. Supongamos que tienes una clase con un monton de propiedades del tipo JTextField:

import java.lang.reflect.Field;

import javax.swing.JTextField;

public class Tmp {

        JTextField campo0;
        JTextField campo1;
        JTextField campo2;
        JTextField campo3;
        JTextField campo4;
       
        public Tmp(){
                campo0 = new JTextField("Campo 0");
                campo1 = new JTextField("Campo 1");
                campo2 = new JTextField("Campo 2");
                campo3 = new JTextField("Campo 3");
                campo4 = new JTextField("Campo 4");
        }
       
        public String leerValores(){
                StringBuilder sb = new StringBuilder();
               
                for(int i=0; i<5; i++){
                        try {
                                Field field = getClass().getDeclaredField("campo" + i);
                                JTextField prop = (JTextField)field.get(this);
                               
                                sb.append(prop.getText());
                        } catch (SecurityException e) {
                                e.printStackTrace();
                        } catch (NoSuchFieldException e) {
                                e.printStackTrace();
                        } catch (IllegalArgumentException e) {
                                e.printStackTrace();
                        } catch (IllegalAccessException e) {
                                e.printStackTrace();
                        }
                }
               
                return sb.toString();
        }
       
        public static void main(String[] args){
                Tmp tmp = new Tmp();
                String cad = tmp.leerValores();
               
                System.out.println("Valores: " + cad);
                System.exit(0);
        }
}

Espero te sirva, saludos

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">