¿Ejecutable con un parámetro?

Resuelto uTubeFan asked hace 13 años • 11 respuestas

Necesito un "Ejecutable que acepte un parámetro", aunque sé que dicho ejecutable realmente no existe.

Esto puede indicar una falla fundamental en el diseño de mi aplicación y/o un bloqueo mental en mi cerebro cansado, por lo que espero encontrar aquí algunos consejos sobre cómo lograr algo como lo siguiente, sin violar los principios fundamentales de OO:

  private Runnable mOneShotTask = new Runnable(String str) {
    public void run(String str) {
       someFunc(str);
    }
  };  

¿Alguna idea de cómo lograr algo como lo anterior?

uTubeFan avatar May 02 '11 10:05 uTubeFan
Aceptado

Bueno, han pasado casi 9 años desde que publiqué esto originalmente y, para ser honesto, Java ha realizado un par de mejoras desde entonces. Dejaré mi respuesta original a continuación, pero no es necesario que la gente haga lo que contiene. Hace 9 años, durante la revisión del código, me habría preguntado por qué lo hicieron y tal vez lo aprobaron, tal vez no. Con lambdas modernas disponibles, es irresponsable tener una respuesta tan votada que recomiende un enfoque anticuado (que, para ser justos, era dudoso para empezar...) En Java moderno, esa revisión de código sería inmediatamente rechazada, y esto sería sugirió:

void foo(final String str) {
    Thread t = new Thread(() -> someFunc(str));
    t.start();
}

Como antes, detalles como manejar ese hilo de manera significativa se dejan como ejercicio para el lector. Pero para decirlo sin rodeos, si tienes miedo de usar lambdas, deberías tener aún más miedo de los sistemas multiproceso.

Respuesta original, solo porque:

Puedes declarar una clase directamente en el método.

void Foo(String str) {
    class OneShotTask implements Runnable {
        String str;
        OneShotTask(String s) { str = s; }
        public void run() {
            someFunc(str);
        }
    }
    Thread t = new Thread(new OneShotTask(str));
    t.start();
}
corsiKa avatar May 02 '2011 03:05 corsiKa

Podrías ponerlo en una función.

String paramStr = "a parameter";
Runnable myRunnable = createRunnable(paramStr);

private Runnable createRunnable(final String paramStr){

    Runnable aRunnable = new Runnable(){
        public void run(){
            someFunc(paramStr);
        }
    };

    return aRunnable;

}

(Cuando usé esto, mi parámetro era un ID entero, que usé para hacer un mapa hash de ID --> myRunnables. De esa manera, puedo usar el mapa hash para publicar/eliminar diferentes objetos myRunnable en un controlador).

HaoQi Li avatar Apr 19 '2012 23:04 HaoQi Li
theView.post(new Runnable() {
    String str;
    @Override                            
    public void run() {
        par.Log(str);                              
    }
    public Runnable init(String pstr) {
        this.str=pstr;
        return(this);
    }
}.init(str));

Cree una función de inicio que devuelva el objeto en sí e inicialice los parámetros con él.

Tommi Rouvali avatar May 23 '2013 17:05 Tommi Rouvali